Flutter本地数据库管理插件sqlite3的使用
Flutter本地数据库管理插件sqlite3的使用
sqlite3简介
sqlite3
是一个提供Dart绑定到SQLite的库,通过 dart:ffi
实现。SQLite是一个轻量级的关系型数据库管理系统,适用于移动应用、嵌入式系统和其他需要本地数据存储的应用场景。
使用此库
- 确保环境中有可用的共享库:根据支持的平台部分,确保您的环境中可以获取到SQLite的动态链接库。
- 导入包:
import 'package:sqlite3/sqlite3.dart';
- 打开数据库:可以通过
sqlite3.open()
打开一个文件数据库,或者通过sqlite3.openInMemory()
打开一个内存中的临时数据库。 - 执行SQL语句:使用
Database.execute
或Database.prepare
来直接执行或准备SQL语句。 - 清理资源:不再需要时记得关闭预处理语句或数据库连接,以避免资源泄露。
示例代码
以下是一个完整的示例程序,展示了如何在Flutter中使用sqlite3
创建表、插入数据和查询数据:
import 'dart:io';
import 'package:sqlite3/sqlite3.dart';
void main() {
print('Using sqlite3 ${sqlite3.version}');
// 创建一个新的内存数据库。如果要使用文件支持的数据库,可以用 sqlite3.open(yourFilePath) 替换
final db = sqlite3.openInMemory();
// 创建一个表格并插入一些数据
db.execute('''
CREATE TABLE artists (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
''');
// 准备一条语句以便多次执行
final stmt = db.prepare('INSERT INTO artists (name) VALUES (?)');
stmt
..execute(['The Beatles'])
..execute(['Led Zeppelin'])
..execute(['The Who'])
..execute(['Nirvana']);
// 处理完后释放语句资源
stmt.dispose();
// 可以通过PreparedStatement.select 或者直接在数据库上调用 select 方法来运行查询语句
final ResultSet resultSet =
db.select('SELECT * FROM artists WHERE name LIKE ?', ['The %']);
// 遍历结果集以逐行获取Row对象
for (final Row row in resultSet) {
print('Artist[id: ${row['id']}, name: ${row['name']}]');
}
// 注册一个可以在SQL中调用的自定义函数
db.createFunction(
functionName: 'dart_version',
argumentCount: const AllowedArgumentCount(0),
function: (args) => Platform.version,
);
print(db.select('SELECT dart_version()'));
// 记得释放数据库资源以防止内存泄漏
db.dispose();
}
支持的平台
sqlite3
支持多种平台,包括但不限于:
- Android: 可以依赖
sqlite3_flutter_libs
包来打包最新的 SQLite 版本。 - iOS: 内置了SQLite版本,默认情况下会使用它;也可以依赖
sqlite3_flutter_libs
。 - Linux: 可以依赖
sqlite3_flutter_libs
,或者从发行版的包管理器安装SQLite(如Debian上的libsqlite3-dev
)。 - macOS: 同样内置了SQLite,并且可以选择依赖
sqlite3_flutter_libs
。 - Windows: 可以依赖
sqlite3_flutter_libs
,不使用Flutter时则需手动包含SQLite。 - Web: 支持通过WebAssembly编译后的SQLite版本进行访问,但仅限于
dartdevc
和dart2js
编译器。
数据类型支持
当绑定参数到查询时,支持的数据类型有int
、double
、String
、List<int>
(用于BLOB)和null
。在网页端还额外支持BigInt
。
WebAssembly(Web支持)
对于Web的支持是实验性的,需要特定方式编译的SQLite WebAssembly模块以及文件系统实现。更多细节请参阅官方文档。
其他特性
- 手动提供SQLite库:允许用户自行打包SQLite库。
- 加密支持:支持加载带有加密功能的SQLite Multiple Ciphers版本。
- 跨平台代码共享:提供了公共接口供不同平台间的代码复用。
- 测试与构建:详细的测试指导和从源码编译指南。
以上就是关于sqlite3
插件的基本介绍及使用方法,希望对您有所帮助!如果您有任何疑问或需要更深入的帮助,请随时提问。
更多关于Flutter本地数据库管理插件sqlite3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地数据库管理插件sqlite3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用sqlite3插件进行本地数据库管理的示例代码。需要注意的是,Flutter社区中更常用的SQLite插件是sqflite
,但既然你特别提到了sqlite3
,我会基于这个插件(假设它存在并且功能类似)给出一个示例。不过,请注意,如果sqlite3
插件在Flutter社区中不常见或文档不充足,你可能需要查阅其官方文档或仓库以获取更详细的信息。
首先,确保你已经在pubspec.yaml
文件中添加了sqlite3
插件的依赖(注意:这里假设sqlite3
是一个有效的Flutter插件,实际上你可能需要查找并确认正确的插件名称和版本):
dependencies:
flutter:
sdk: flutter
sqlite3: ^x.y.z # 替换为实际的版本号
然后,运行flutter pub get
来安装依赖。
接下来,是一个简单的Flutter应用示例,展示了如何使用sqlite3
插件进行数据库操作:
import 'package:flutter/material.dart';
import 'package:sqlite3/sqlite3.dart'; // 假设插件名为sqlite3
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter SQLite3 Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
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 DemoTable ('
'id INTEGER PRIMARY KEY,'
'name TEXT NOT NULL,'
'value INTEGER NOT NULL'
')'
);
});
}
Future<void> insertData() async {
await db.transaction((txn) async {
await txn.execute(
'INSERT INTO DemoTable(name, value) VALUES(?, ?)',
['Alice', 42]
);
});
}
Future<List<Map<String, dynamic>>> queryData() async {
return await db.query('DemoTable', columns: ['id', 'name', 'value']);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter SQLite3 Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
await insertData();
setState(() {}); // 触发UI更新(如果需要)
},
child: Text('Insert Data'),
),
ElevatedButton(
onPressed: () async {
List<Map<String, dynamic>> results = await queryData();
// 这里可以处理查询结果,比如显示在屏幕上
print(results);
},
child: Text('Query Data'),
),
],
),
),
);
}
@override
void dispose() {
db.close(); // 关闭数据库连接
super.dispose();
}
}
在这个示例中,我们:
- 在
initState
方法中初始化了数据库,并创建了一个名为DemoTable
的表。 - 提供了一个
insertData
方法,用于向表中插入数据。 - 提供了一个
queryData
方法,用于从表中查询数据。 - 在UI中提供了两个按钮,分别用于触发插入和查询操作。
请注意,inMemoryDatabasePath
是一个用于创建内存数据库的快捷方式,它在实际应用中可能不是你所需要的。你可能希望使用文件路径来持久化数据库。此外,sqlite3
插件的具体API可能有所不同,因此你需要查阅其官方文档以获取准确的用法。
如果sqlite3
插件实际上不存在或不可用,你可能需要查找并使用其他流行的SQLite插件,如sqflite
。