Flutter数据库操作插件sqflite_common_ffi的使用
Flutter数据库操作插件sqflite_common_ffi的使用
sqflite_common_ffi
是基于sqflite
和sqlite3
的一个FFI(Foreign Function Interface)实现,它允许你在Flutter项目中更灵活地操作SQLite数据库。该插件在Linux、MacOS和Windows上都可以工作,并且可以在iOS和Android平台上通过sqlite3_flutter_libs
来使用。
一、开始之前
添加依赖
首先,在你的pubspec.yaml
文件中添加sqflite_common_ffi
作为开发依赖:
dev_dependencies:
sqflite_common_ffi:
环境准备
-
Linux:需要安装
libsqlite3
和libsqlite3-dev
包。对于Ubuntu系统,可以运行以下命令:sudo apt-get -y install libsqlite3-0 libsqlite3-dev
-
MacOS:通常情况下不需要额外配置。
-
Windows:在调试模式下可以直接使用,但在发布模式时需要将
sqlite3.dll
放置于可执行文件同一目录下。
二、示例代码
单元测试中的使用
下面是一个简单的单元测试示例,展示了如何使用sqflite_common_ffi
进行基本的数据库操作:
import 'package:test/test.dart';
import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
void main() {
// 初始化FFI加载器(如果需要的话)
sqfliteFfiInit();
test('simple sqflite example', () async {
var db = await databaseFactoryFfi.openDatabase(inMemoryDatabasePath);
expect(await db.getVersion(), 0);
await db.close();
});
}
更多关于单元测试的信息,请参考官方文档。
应用程序中的使用
接下来,我们来看一个完整的应用程序示例,包括创建表、插入数据以及查询数据:
import 'dart:io' as io;
import 'package:path/path.dart' as p;
import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:path_provider/path_provider.dart';
Future<void> main() async {
// 初始化FFI加载器(如果需要的话)
sqfliteFfiInit();
var databaseFactory = databaseFactoryFfi;
final io.Directory appDocumentsDir = await getApplicationDocumentsDirectory();
// 创建数据库路径
String dbPath = p.join(appDocumentsDir.path, "databases", "myDb.db");
var db = await databaseFactory.openDatabase(dbPath);
// 创建表格
await db.execute('''
CREATE TABLE Product (
id INTEGER PRIMARY KEY,
title TEXT
)
''');
// 插入数据
await db.insert('Product', <String, Object?>{'title': 'Product 1'});
await db.insert('Product', <String, Object?>{'title': 'Product 2'});
// 查询数据
var result = await db.query('Product');
print(result); // 输出:[{id: 1, title: Product 1}, {id: 2, title: Product 2}]
// 关闭数据库连接
await db.close();
}
此示例还展示了如何结合path_provider
插件来确定应用文档目录的位置,并在此基础上构建数据库文件的完整路径。
三、注意事项
- 数据库调用是在单独的隔离区(isolate)中完成的;
- 多实例支持是模拟实现的;
getDatabasesPath()
方法有一个简化的实现方式,建议根据实际情况使用如path_provider
这样的包来自定义策略。
希望这些信息能够帮助你更好地理解和使用sqflite_common_ffi
插件!如果你有任何问题或遇到困难,欢迎随时提问。
更多关于Flutter数据库操作插件sqflite_common_ffi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库操作插件sqflite_common_ffi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,sqflite_common_ffi
是一个用于数据库操作的插件,它依赖于 sqflite
插件,并且提供了一个基于 FFI(Foreign Function Interface)的实现,允许在桌面和移动平台上使用 SQLite 数据库。下面是一个简单的代码案例,展示了如何使用 sqflite_common_ffi
在 Flutter 中进行数据库操作。
首先,确保在 pubspec.yaml
文件中添加依赖项:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+4 # 确保版本是最新的,或者根据实际需要选择
sqflite_common_ffi: ^2.0.0+4 # 确保版本与 sqflite 兼容
然后,运行 flutter pub get
来获取依赖项。
接下来,是一个完整的 Flutter 应用示例,展示了如何使用 sqflite_common_ffi
进行数据库操作:
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
void main() {
// 设置数据库工厂使用 FFI 实现
databaseFactory = databaseFactoryFfi;
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter SQLite Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Database? _db;
@override
void initState() {
super.initState();
_initializeDatabase();
}
Future<void> _initializeDatabase() async {
// 打开(或创建)数据库
_db = await openDatabase(
inMemoryDatabasePath, // 使用内存数据库,也可以使用文件路径
version: 1,
onCreate: (Database db, int version) async {
// 创建表
await db.execute(
'CREATE TABLE DemoTable ('
'id INTEGER PRIMARY KEY,'
'name TEXT NOT NULL,'
'value INTEGER NOT NULL'
')',
);
},
);
}
Future<void> _insertData() async {
// 插入数据
await _db?.insert(
'DemoTable',
{'name': 'Alice', 'value': 42},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<List<Map<String, dynamic>>> _queryData() async {
// 查询数据
return await _db?.query('DemoTable');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter SQLite Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _insertData,
child: Text('Insert Data'),
),
ElevatedButton(
onPressed: async () async {
List<Map<String, dynamic>> rows = await _queryData();
// 简单的 UI 更新,展示查询结果
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Query Result: ${rows.map((row) => row['name']).join(', ')}'),
),
);
},
child: Text('Query Data'),
),
],
),
),
);
}
}
解释
-
设置数据库工厂:在
main
函数中,我们设置了数据库工厂使用 FFI 实现 (databaseFactory = databaseFactoryFfi;
)。 -
数据库初始化:在
_MyHomePageState
的initState
方法中,我们打开(或创建)了一个数据库,并在onCreate
回调中创建了一个表。 -
插入数据:
_insertData
方法展示了如何向表中插入数据。 -
查询数据:
_queryData
方法展示了如何从表中查询数据。 -
UI 操作:在 UI 中,我们有两个按钮,一个用于插入数据,另一个用于查询数据并显示结果。
这个示例展示了基本的数据库操作,包括打开/创建数据库、创建表、插入数据和查询数据。根据具体需求,你可以进一步扩展这些功能。