Flutter嵌入式数据库插件unqlite的使用

发布于 1周前 作者 vueper 来自 Flutter

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

1 回复

更多关于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.'),
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!