Skip to content

Latest commit

 

History

History
157 lines (112 loc) · 7.68 KB

README.md

File metadata and controls

157 lines (112 loc) · 7.68 KB

sqlite3_simple

Pub Package simple-native

Android iOS MacOS Windows Ubuntu

基于 Simple (支持中文和拼音的 SQLite fts5 全文搜索扩展) 和 sqlite3.dart 的 Flutter 库,用于 SQLite 中文和拼音全文搜索。

Important

由于 sqlite3-ohos.dart 在 HarmonyOS NEXT 上在提交审核后打出正式签名 Release 包崩溃的问题,目前暂时删除适配说明,请不要在 HarmonyOS NEXT 平台上继续使用。

支持平台 示例
Android
(example.apk)
Android
iOS iOS
Windows Windows
MacOS MacOS
Linux Linux

目录

前置准备

Tip

本库主要通过 Github Actions 编译和维护 Simple 原生库,以支持本库在不同平台的 Flutter 实现,具体请参阅 simple-native 分支

SQLite 通过 SQLite FTS5 Extension 提供 全文搜索 (Full-Text Search) 功能;

Dart 提供 FFI 以调用 SQLite、Simple 等 C/C++ 库;

本库通过 Simple 实现 中文拼音全文搜索,通过 sqlite3 操作数据库和加载自定义扩展。如果您使用 Drift 操作数据库,由于 Drift 基于 sqlite3 ,同样可以使用本库实现中文拼音全文搜索(理论上,也适用于任何依赖于 sqlite3 的 Flutter 库)。

请参阅相关文档,或 example 的具体示例,以构建和操作数据库。

快速开始

1. 添加 SQLite 依赖

执行如下命令行:

flutter pub add sqlite3 sqlite3_flutter_libs

其中 sqlite3 包含了 SQLite 的 Dart FFI 绑定, sqlite3_flutter_libs 包含了 SQLite 的原生库 (Native Library) ,源码均在 sqlite3.dart

Tip

若希望自行编译 SQLite 原生库,或环境已存在 SQLite 原生库,可不引入 sqlite3_flutter_libs ,自行通过 DynamicLibraryopen.overrideFor 加载和覆盖。您可以从下述位置获取相关信息:

  1. sqlite.dartManually providing sqlite3 libraries
  2. sqlite-ohos.dart自行提供 SQLite 原生库
  3. example 中带有 Android SQLite 覆盖 标识的简单示例(可以全局搜索该标识)。

2. 添加本库并导入依赖

flutter pub add sqlite3_simple
import 'package:sqlite3/sqlite3.dart';
import 'package:sqlite3_simple/sqlite3_simple.dart';

3. 加载 Simple 扩展

sqlite3.loadSimpleExtension();

如需启用 结巴分词 (Jieba) ,请调用 sqlite3.saveJiebaDict() 将字典保存到可访问的路径,例如:

import 'package:path_provider/path_provider.dart';

final docDir = await getApplicationDocumentsDirectory();
final jiebaDictPath = join(docDir.path, "cpp_jieba");

final jiebaDictSql = await sqlite3.saveJiebaDict(jiebaDictPath);

返回值 jiebaDictSql"SELECT jieba_dict('$jiebaDictPath')"

4. 打开数据库

参阅 sqlite3 相关说明,通过 sqlite3.open()sqlite3.openInMemory() 打开数据库。

final db = sqlite3.open('$filename');

如需启用结巴分词,请让数据库执行上一步的 jiebaDictSql 语句,以修改 Simple 扩展读取结巴分词字典的路径:

db.execute(jiebaDictSql);

推荐在正式查询前执行一次查询,提前加载,例如:

db.select("SELECT jieba_query('Jieba分词初始化(提前加载避免后续等待)')");

5. 查询

请参阅 SQLite FTS5 ExtensionSimple 的说明,根据需要调用相应函数如 jieba_querysimple_queryhighlightsimple_highlight 等,执行所需的查询,例如 ( ./expample/lib/dao.dart ):

/// 通过指定分词器 [tokenizer] 搜索, [tokenizer] 取值:jieba, simple
List<MainTableRow> search(String value, String tokenizer) {
  const wrapperSql = "'${ZeroWidth.start}', '${ZeroWidth.end}'";
  final resultSet = db.select('''
      SELECT 
        rowid AS $id, 
        simple_highlight($fts5Table, 0, $wrapperSql) AS $title, 
        simple_highlight($fts5Table, 1, $wrapperSql) AS $content, 
        $insertDate 
      FROM $fts5Table 
      WHERE $fts5Table MATCH ${tokenizer}_query(?);
    ''', [value]);
  return _toMainTableRows(resultSet);
}

待办

  • 添加其他平台的适配。
    • Windows
    • MacOS
    • Linux
    • HarmonyOS NEXT
  • 添加用户自定义字典。

致谢

Simple:支持中文和拼音的 SQLite FTS5 全文搜索扩展。

sqlite3.dart:SQLite3 的 Dart FFI 绑定。

extended_text:Flutter Text 的扩展组件,支持特殊文本效果。