[官网文档翻译]Flutter持久化库drift - 使用sql - 支持的sqlite扩展

11,321 阅读2分钟

「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」。

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

本文翻译自 drift 的 官方文档 Supported sqlite extensions (simonbinder.eu)

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


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

支持的 sqlite 扩展

注: 因为 moor_flutter 使用了设备上装载的 sqlite 版本,那在这些设备上这些扩展可能无法使用。 当使用这些扩展时,强烈建议使用 NativeDatabase。这会使下面列出的扩展在所有的 Android 和 iOS 设备上可用。

json1

要使 drift 文件和编译后的查询中的 json1 扩展可用,需要修改构建选项,在 sqlite_module 部分将 json1 包含进去。

这个 sqlite 扩展不需要其它的表,对所有的 text 列可用。这个扩展可用的话,在 drift 文件和编译后的查询中,所有的 json 函数都可用。

因为 json 扩展是可选的,要在 Dart 查询中也可用需要一个特殊的 import, package:drift/extensions/json1.dart。 下面展示了一个在 Dart 中使用 json 函数的示例:

import 'package:drift/drift.dart';
import 'package:drift/extensions/json1.dart';

class Contacts extends Table {
    IntColumn get id => integer().autoIncrement()();
    TextColumn get data => text()();
}

@DriftDatabase(tables: [Contacts])
class Database extends _$Database {
  // 此处省略构造方法和 schemaVersion

  Future<List<Contacts>> findContactsWithNumber(String number) {
    return (select(contacts)
      ..where((row) {
        // 假定 phone number 是存储在 `data` 列中的一个 json key 。
        final phoneNumber = row.data.jsonExtract<String, StringType>('phone_number');
        return phoneNumber.equals(number);
      })
    ).get();
  } 
}

可以在 sqlite.org 学习更多有关 json1 扩展的内容。

fts5

fts5 扩展提供了在 sqlite 表中全文搜索的能力。为了使 fts5 扩展在 drift 文件和编译后查询中可用,需要修改构建选项sqlite_module 部分把 fts5 包含进来。

正如所期望的,当使用 sqlite 时,可以 在 drift 文件中使用 CREATE VIRTUAL TABLE 语句创建一个 fts5 表。

CREATE VIRTUAL TABLE email USING fts5(sender, title, body);

对 fts5 的查询会如期望中运转:

emailsWithFts5: SELECT * FROM email WHERE email MATCH 'fts5' ORDER BY rank;

用于 fts5 的 bm25highlightsnippet 函数也可用于自定义查询。

在 Dart 中无法声明 fts5 表,也无法对 fts5 表进行查询。

可以在 sqlite.org 学习更多有关 json1 扩展的内容。