Flutter数据库管理插件sqlite3_flutter_libs的使用
Flutter数据库管理插件sqlite3_flutter_libs的使用
简介
sqlite3_flutter_libs
插件本身不包含任何 Dart 代码。它为 Android、iOS、macOS、Linux 和 Windows 提供了原生的 sqlite3
库。有关如何在 Flutter 应用中实际使用此包,请参阅 sqlite3。
该包编译的 sqlite3 版本使用了推荐的编译选项,并默认包含 fts5
模块(json1
模块是最近版本 sqlite3 的默认构建的一部分)。其他模块未包含在此构建中。
Android 注意事项
包含的平台
在 Android 上,此库将为以下所有平台捆绑 sqlite3:
arm64-v8a
armeabi-v7a
x86
x86_64
如果您不打算发布到 32 位 x86
设备,则需要在 build.gradle
中应用过滤器:
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
}
}
}
Android 6 的问题
在 Android 6 上加载原生库时可能会出现问题。如果您遇到这些崩溃,可以尝试在 gradle.properties
文件中设置 android.bundle.enableUncompressedNativeLibs=false
。请注意,这会增加应用程序安装后的大小。
或者,您可以使用 applyWorkaroundToOpenSqlite3OnOldAndroidVersions
方法。该方法会在 Java 中尝试打开 sqlite3
,这似乎更可靠。加载 sqlite3
后,我们也可以在 Dart 中打开它。此方法应在使用 sqlite3
之前调用(无论是直接还是通过 package:drift
中的 NativeDatabase
间接调用)。
由于 applyWorkaroundToOpenSqlite3OnOldAndroidVersions
使用平台通道,在后台隔离区中使用它可能会有问题。我们建议在主隔离区中等待它,在启动可能使用数据库的后台隔离区之前。
提供临时路径
如果复杂的查询失败并显示 SQLITE_IOERR_GETTEMPPATH 6410
错误,您可以尝试显式设置 sqlite3 使用的临时路径。此评论包含一个实现此功能的代码片段。
示例代码
以下是一个完整的示例,演示如何在 Flutter 应用中使用 sqlite3_flutter_libs
和 sqlite3
包进行数据库操作:
pubspec.yaml
dependencies:
flutter:
sdk: flutter
sqlite3_flutter_libs: ^0.5.0
sqlite3: ^2.0.0
main.dart
import 'package:flutter/material.dart';
import 'package:sqlite3/sqlite3.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Apply workaround for old Android versions if necessary
await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
runApp(MyApp());
}
Future<void> applyWorkaroundToOpenSqlite3OnOldAndroidVersions() async {
// Implement the workaround as needed for old Android versions
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SQLite Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'SQLite Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late Database db;
List<Map<String, Object?>>? items;
@override
void initState() {
super.initState();
openDatabase();
}
void openDatabase() {
// Open a connection to the database (note: path should be adjusted as needed)
db = sqlite3.open('example.db');
// Create a table
db.execute('''
CREATE TABLE IF NOT EXISTS items (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
''');
// Insert some data
db.execute("INSERT INTO items (name) VALUES ('Item 1')");
db.execute("INSERT INTO items (name) VALUES ('Item 2')");
// Query the database
items = db.select('SELECT * FROM items');
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView.builder(
itemCount: items?.length ?? 0,
itemBuilder: (context, index) {
final item = items![index];
return ListTile(
title: Text(item['name'] as String),
);
},
),
);
}
@override
void dispose() {
db.close();
super.dispose();
}
}
这个示例展示了如何创建一个简单的 SQLite 数据库,插入一些数据,并在 Flutter 应用中显示这些数据。请根据您的具体需求调整数据库路径和其他配置。
以上内容详细介绍了 `sqlite3_flutter_libs` 插件的使用方法,并提供了一个完整的示例代码来帮助您更好地理解其用法。希望这对您有所帮助!
更多关于Flutter数据库管理插件sqlite3_flutter_libs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库管理插件sqlite3_flutter_libs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用sqlite3_flutter_libs
插件进行数据库管理的代码示例。这个插件允许你在Flutter应用中直接操作SQLite数据库。
首先,你需要在你的pubspec.yaml
文件中添加这个依赖:
dependencies:
flutter:
sdk: flutter
sqlite3_flutter_libs: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,是一个简单的示例,展示如何打开数据库、创建表、插入数据、查询数据以及关闭数据库。
import 'package:flutter/material.dart';
import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SQLite3 Flutter Demo'),
),
body: DatabaseDemo(),
),
);
}
}
class DatabaseDemo extends StatefulWidget {
@override
_DatabaseDemoState createState() => _DatabaseDemoState();
}
class _DatabaseDemoState extends State<DatabaseDemo> {
late Database db;
@override
void initState() {
super.initState();
initDatabase();
}
Future<void> initDatabase() async {
// 打开数据库(如果数据库不存在,则创建一个新的)
db = await openDatabase(inMemoryDatabasePath, version: 1, onCreate: (Database db, int version) async {
// 创建一个表
await db.execute(
'''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
'''
);
});
}
Future<void> insertData() async {
// 插入数据
await db.insert(
'users',
{
'name': 'Alice',
'age': 30,
},
conflictAlgorithm: ConflictAlgorithm.replace
);
await db.insert(
'users',
{
'name': 'Bob',
'age': 25,
},
conflictAlgorithm: ConflictAlgorithm.replace
);
}
Future<List<Map<String, dynamic>>> queryData() async {
// 查询数据
return await db.query('users');
}
Future<void> closeDatabase() async {
// 关闭数据库
await db.close();
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
await insertData();
final data = await queryData();
print(data); // 在控制台打印查询结果
},
child: Text('Insert and Query Data'),
),
ElevatedButton(
onPressed: closeDatabase,
child: Text('Close Database'),
),
],
),
);
}
@override
void dispose() {
// 确保在组件销毁时关闭数据库
closeDatabase().then((_) => super.dispose());
}
}
代码说明:
- 依赖添加:在
pubspec.yaml
中添加sqlite3_flutter_libs
依赖。 - 数据库初始化:在
initDatabase
方法中,使用openDatabase
方法打开或创建一个数据库,并在onCreate
回调中创建一个表。 - 数据插入:
insertData
方法向users
表中插入数据。 - 数据查询:
queryData
方法从users
表中查询数据并返回。 - 数据库关闭:
closeDatabase
方法关闭数据库连接。 - UI交互:在UI中提供了按钮来触发数据插入、查询和数据库关闭操作。
请注意,inMemoryDatabasePath
用于创建一个内存数据库,这在开发阶段很有用,但在生产环境中你可能希望使用持久化存储路径。
希望这个示例能帮助你理解如何在Flutter项目中使用sqlite3_flutter_libs
插件进行数据库管理。