Flutter嵌入式数据库插件unqlite的使用
Flutter嵌入式数据库插件unqlite的使用
UnQLite 是一个嵌入式的 NoSQL 数据库,unqlite_flutter
插件将它封装用于 Flutter 应用程序。通过 unqlite_flutter
,您可以轻松地在 Flutter 中使用 UnQLite 的功能。
安装
首先,在您的 pubspec.yaml
文件中添加以下依赖项:
dependencies:
unqlite: latest
unqlite_flutter: latest
然后运行 flutter pub get
来安装这些依赖。
使用示例
Key-Value Store
创建或打开数据库
// 创建或打开一个数据库
UnQLite db = UnQLite.open("${appDocDir.path}/test.db");
存储键值对
// 保存键值对
db.store("name", "Alex");
db.store("age", 18);
db.store(19, "haha");
获取值
// 通过键获取值,但必须指定值的泛型类型
debugPrint(db.fetch<String>("name")); // 输出: Alex
debugPrint('${db.fetch<int>("age")}'); // 输出: 18
debugPrint(db.fetch<String>(19)); // 输出: haha
使用回调函数获取值
// 另一种获取值的方式,可能比 fetch 更快
db.fetchCallback<int>("age", (val) {
debugPrint('age=$val'); // 输出: age=18
});
使用游标获取数据
// 使用游标获取数据
var cursor = db.cursor();
cursor.seek('name');
debugPrint('=> ${cursor.key} => ${cursor.value}'); // 输出: => name => Alex
使用事务
// 使用事务,这是一个很棒的功能
var trans = db.transaction().begin();
try {
for (var i = 0; i < 100000; i++) {
if (i == 10) {
// 这里抛出异常
throw Exception('test');
}
db.store("transaction_$i", "here is a transaction_$i");
}
trans.commit(); // 提交事务
} catch (e) {
// 如果发生异常,事务回滚
trans.rollback();
}
遍历所有数据
// 使用迭代器遍历所有数据
for (var entry in db.cursor()) {
var content = '${entry.key} => ${entry.value}';
debugPrint(content); // 输出所有键值对
}
JSON 文档存储
// 创建或打开一个数据库
UnQLite db = UnQLite.open("${appDocDir.path}/test2.db");
var users = db.collection("users");
// 创建集合
users.create();
// 存储 JSON 数据
users.store(jsonDecode('''
{
"title": "test json string",
"author": [
"arcticfox1919"
],
"year": 2022,
"like": "flutter"
}
'''));
users.store({'name': 'Mickey', 'age': 17});
users.store([
{'name': 'Alice', 'age': 18},
{'name': 'Bruce', 'age': 19},
{'name': 'Charlie', 'age': 20},
]);
// 获取所有数据
print(users.all());
// 获取创建日期
print(users.creationDate());
// 获取集合长度
print(users.len());
// 获取当前记录
print(users.fetchCurrent());
// 删除所有数据
users.drop();
db.close();
为什么选择它?
- 性能更快:相比 Hive,UnQLite 的读写速度更快,占用内存更少。
- 支持 JSON 文档:可以方便地存储和操作 JSON 数据。
缺点
由于使用了 Dart FFI(Foreign Function Interface),因此无法在 Web 平台上使用。
性能测试数据
以下是 UnQLite 和 Hive 的性能对比(单位:毫秒):
UnQLite
UnQLite init:1 ms
write 100,000 entries :611 ms
fetch 100,000 entries :370 ms
seek 100,000 entries :215 ms
iterate 100,000 entries :225 ms
transaction rollback :39 ms
Hive
Hive init:48 ms
put 100,000 entries :807 ms
get 100,000 entries :290 ms
以下是性能测试的代码示例:
testUnQLite() async {
var appDocDir = await getApplicationDocumentsDirectory();
final start = DateTime.now().millisecondsSinceEpoch;
UnQLite db = UnQLite.open("${appDocDir.path}/test.db");
final t1 = DateTime.now().millisecondsSinceEpoch;
for (var i = 0; i < 100000; i++) {
db.store("my_key_$i", "Here is a value for testing—$i");
}
final t2 = DateTime.now().millisecondsSinceEpoch;
for (var i = 0; i < 100000; i++) {
var r = db.fetch<String>("my_key_$i");
// debugPrint("fetch :$r");
}
final t3 = DateTime.now().millisecondsSinceEpoch;
var cursor = db.cursor();
for (var i = 0; i < 100000; i++) {
cursor.seek('my_key_$i');
// debugPrint('=> ${cursor.key} => ${cursor.value}');
}
final t4 = DateTime.now().millisecondsSinceEpoch;
var count = 0;
for (var entry in db.cursor()) {
count++;
var content = '${entry.key} => ${entry.value}';
// debugPrint(content);
}
print('count => $count');
final t5 = DateTime.now().millisecondsSinceEpoch;
var trans = db.transaction().begin();
try {
for (var i = 0; i < 100000; i++) {
if (i == 10) {
throw Exception('test');
}
db.store("transaction_$i", "here is a transaction_$i");
}
trans.commit();
} catch (e) {
trans.rollback();
}
final t6 = DateTime.now().millisecondsSinceEpoch;
debugPrint("UnQLite init:${t1-start} ms");
debugPrint("write 100,000 entries :${t2-t1} ms");
debugPrint("fetch 100,000 entries :${t3-t2} ms");
debugPrint("seek 100,000 entries :${t4-t3} ms");
debugPrint("iterate 100,000 entries :${t5-t4} ms");
debugPrint("transaction rollback :${t6-t5} ms");
db.close();
}
testHive() async {
var appDocDir = await getApplicationDocumentsDirectory();
var path = appDocDir.path;
final start = DateTime.now().millisecondsSinceEpoch;
Hive.init(path);
var box = await Hive.openBox('testBox');
final t1 = DateTime.now().millisecondsSinceEpoch;
for (var i = 0; i < 100000; i++) {
box.put("my_key_$i", "here is a transaction_$i");
}
final t2 = DateTime.now().millisecondsSinceEpoch;
for (var i = 0; i < 100000; i++) {
var name = box.get('my_key_$i');
}
final t3 = DateTime.now().millisecondsSinceEpoch;
box.close();
debugPrint("Hive init:${t1-start} ms");
debugPrint("put 100,000 entries :${t2-t1} ms");
debugPrint("get 100,000 entries :${t3-t2} ms");
}
示例代码
以下是完整的示例代码:
import 'package:unqlite/unqlite.dart';
import 'dart:convert';
void main() {
// 创建或打开数据库
UnQLite unqlite = UnQLite.open("./test/test.db");
// 存储键值对
unqlite.store("name", "Alex");
unqlite.store("age", "18");
// 获取并打印键值
print(unqlite.fetch("name")); // 输出: Alex
print(unqlite.fetch("age")); // 输出: 18
// 追加值到已有键
unqlite.append("age", "19");
// 使用回调函数获取值
unqlite.fetchCallback("age", (value) {
print(value); // 输出: 1819
});
// 使用游标获取数据
var cursor = unqlite.cursor();
cursor.seek('name');
print('=> ${cursor.key} => ${cursor.value}'); // 输出: => name => Alex
// 使用事务
var trans = unqlite.transaction().begin();
try {
for (var i = 0; i < 100000; i++) {
if (i == 10) {
throw Exception('test');
}
unqlite.store("transaction_$i", "here is a transaction_$i");
}
trans.commit(); // 提交事务
} catch (e) {
trans.rollback(); // 回滚事务
}
// 遍历所有数据
for (var entry in unqlite.cursor()) {
var content = '${entry.key} => ${entry.value}';
print(content); // 输出所有键值对
}
// JSON 文档存储
var users = unqlite.collection("users");
users.create();
users.store(jsonDecode('''
{
"title": "test json string",
"author": [
"arcticfox1919"
],
"year": 2022,
"like": "flutter"
}
'''));
users.store({'name': 'Mickey', 'age': 17});
users.store([
{'name': 'Alice', 'age': 18},
{'name': 'Bruce', 'age': 19},
{'name': 'Charlie', 'age': 20},
]);
print(users.all()); // 获取所有数据
print(users.creationDate()); // 获取创建日期
print(users.len()); // 获取集合长度
print(users.fetchCurrent()); // 获取当前记录
// 删除所有数据
users.drop();
// 关闭数据库
unqlite.close();
}
更多关于Flutter嵌入式数据库插件unqlite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter嵌入式数据库插件unqlite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
UnQLite
是一个轻量级的嵌入式 NoSQL 数据库,它支持键值存储和文档存储。在 Flutter 中,你可以使用 unqlite
插件来集成 UnQLite 数据库。以下是如何在 Flutter 项目中使用 unqlite
插件的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 unqlite
插件的依赖:
dependencies:
flutter:
sdk: flutter
unqlite: ^0.1.0 # 请检查最新版本
然后运行 flutter pub get
来获取依赖。
2. 初始化 UnQLite 数据库
在你的 Dart 代码中,你可以通过以下方式初始化 UnQLite 数据库:
import 'package:unqlite/unqlite.dart';
void main() async {
// 打开或创建数据库
var db = await UnQLite.open('my_database.db');
// 检查数据库是否成功打开
if (db.isOpen) {
print('Database opened successfully');
} else {
print('Failed to open database');
return;
}
// 使用数据库
// ...
}
3. 插入数据
你可以使用 store
方法来插入数据:
// 插入键值对
await db.store('key1', 'value1');
// 插入 JSON 文档
await db.store('doc1', {'name': 'John', 'age': 30});
4. 查询数据
你可以使用 fetch
方法来查询数据:
// 查询键值对
var value = await db.fetch('key1');
print('Value for key1: $value');
// 查询 JSON 文档
var doc = await db.fetch('doc1');
print('Document for doc1: $doc');
5. 更新数据
你可以使用 store
方法来更新数据:
// 更新键值对
await db.store('key1', 'new_value1');
// 更新 JSON 文档
await db.store('doc1', {'name': 'John', 'age': 31});
6. 删除数据
你可以使用 delete
方法来删除数据:
// 删除键值对
await db.delete('key1');
// 删除 JSON 文档
await db.delete('doc1');
7. 关闭数据库
当你完成数据库操作后,记得关闭数据库:
await db.close();
8. 错误处理
在使用 UnQLite 时,建议添加错误处理来捕获可能的异常:
try {
await db.store('key1', 'value1');
} catch (e) {
print('Error: $e');
}
9. 完整示例
以下是一个完整的示例,展示了如何在 Flutter 中使用 UnQLite 数据库:
import 'package:flutter/material.dart';
import 'package:unqlite/unqlite.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
var db = await UnQLite.open('my_database.db');
if (db.isOpen) {
print('Database opened successfully');
// 插入数据
await db.store('key1', 'value1');
await db.store('doc1', {'name': 'John', 'age': 30});
// 查询数据
var value = await db.fetch('key1');
print('Value for key1: $value');
var doc = await db.fetch('doc1');
print('Document for doc1: $doc');
// 更新数据
await db.store('key1', 'new_value1');
await db.store('doc1', {'name': 'John', 'age': 31});
// 删除数据
await db.delete('key1');
await db.delete('doc1');
// 关闭数据库
await db.close();
} else {
print('Failed to open database');
}
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('UnQLite Example'),
),
body: Center(
child: Text('Check the console for database operations.'),
),
),
);
}
}