[官网文档翻译]Flutter持久化库drift -示例 - 现有的数据库

11,781 阅读1分钟

Flutter持久化库drift(原moor)官方文档翻译汇总 - 掘金 (juejin.cn)

本文翻译自 drift 的 官方文档 Existing databases (simonbinder.eu)

肉翻多有不足,不吝赐教。


重要通知: moor 已改名为 drift 。更多信息[中文]。

现有的数据库

对现有数据库使用 drift 。

可以对 APP 中装载的预编程的数据库使用 drift 。

pre-propulated:预推进。
这里翻译成预编程(整句百度翻译的话是预编程),找不到合适的词,意思感觉是程序操作过的。

包含数据库

首先,创建想要装载到 APP 中的 sqlite3 数据库。可以在开发机器上用 sqlite3 CLI 工具 创建一个数据库。 当然,可以使用库如 sqlite3 (或 drift 本身) 来写程序创建数据库。

要使用户加载这个数据库,需要把它包含到 flutter asset 中去。只是简单地在 pubspec 中包含:

flutter:
  assets:
    - assets/my_database.db

提取数据库

要在使用 drift 前初始化数据库,需要从设备上的 APP 中提取 asset 。 在 drift 中,可以使用 LazyDatabase 在打开数据库之前来执行这个工作:

import 'package:drift/drift.dart';
import 'package:flutter/services.dart' show rootBundle;

LazyDatabase _openConnection() {
  return LazyDatabase(() async {

    // 在这里调用 db.sqlite ,把数据库文件放入 Docuements 文件夹中。
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'app.db'));
    
    if (!await file.exists()) {
        // 从 asset 中提取预编程的数据库。
        final blob = await rootBundle.load('assets/my_database.db');
        await file.writeAsBytes(blob);
    }

    return NativeDatabase(file);
  });
}

最后,使用这个方法打开数据库:

@DriftDatabase(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
  MyDatabase() : super(_openConnection());

  // ...