基于 Simple (支持中文和拼音的 SQLite fts5 全文搜索扩展) 和 sqlite3.dart 的 Flutter 库,用于 SQLite 中文和拼音全文搜索。
支持平台 | 示例 |
---|---|
HarmonyOS (详见此处) |
|
Android (example.apk) |
|
iOS | |
Windows | |
MacOS | |
Linux |
Tip
本库通过 Github Actions 编译 Simple 原生库,具体请参阅 simple-native 分支。
SQLite 通过 SQLite FTS5 Extension 提供 全文搜索 (Full-Text Search) 功能;
Dart 提供 FFI 以调用 SQLite、Simple 等 C/C++ 库;
本库通过 Simple 实现 中文拼音全文搜索,通过 sqlite3 操作数据库和加载自定义扩展。如果您使用 Drift 操作数据库,由于 Drift 基于 sqlite3 ,同样可以使用本库实现中文拼音全文搜索(理论上,也适用于任何依赖于 sqlite3 的 Flutter 库)。
请参阅相关文档,或 example
的具体示例,以构建和操作数据库。
Important
本库基于 鸿蒙突击队 / Flutter 3.22.0 实现 HarmonyOS 适配,示例项目使用的 extended_text
版本是 13.1.0
。
由于官方的破坏性变更,使用 Flutter 3.24 以及更高版本运行示例时会遇到兼容性问题,请将 pubspec.yaml
中的 extended_text
升级到 14.1.0
或更高版本 以解决不兼容报错。
执行如下命令行:
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
,自行通过 DynamicLibrary
、open.overrideFor
加载和覆盖。您可以从下述位置获取相关信息:
- sqlite.dart 中 Manually providing sqlite3 libraries 。
- sqlite-ohos.dart 中 自行提供 SQLite 原生库 。
example
中带有 Android SQLite 覆盖 标识的简单示例(可以全局搜索该标识)。
flutter pub add sqlite3_simple
import 'package:sqlite3/sqlite3.dart';
import 'package:sqlite3_simple/sqlite3_simple.dart';
本库基于 鸿蒙突击队 / Flutter 3.22.0 实现 HarmonyOS 适配,已在 Mac Arm HarmonyOS 模拟器上经过测试。
若需在 HarmonyOS 上使用,请修改项目 pubspec.yaml
文件中 sqlite3
、sqlite3_flutter_libs
的版本:
# 修改项目使用的版本为支持 HarmonyOS 的分支版本
dependencies:
sqlite3:
git:
url: https://github.com/SageMik/sqlite3-ohos.dart
path: sqlite3
ref: sqlite3-2.4.7-ohos
sqlite3_flutter_libs:
git:
url: https://github.com/SageMik/sqlite3-ohos.dart
path: sqlite3_flutter_libs
ref: sqlite3_flutter_libs-0.5.25-ohos
# 覆盖本库和其他库使用的版本为支持 HarmonyOS 的分支版本
dependency_overrides:
sqlite3:
git:
url: https://github.com/SageMik/sqlite3-ohos.dart
path: sqlite3
ref: sqlite3-2.4.7-ohos
sqlite3_flutter_libs:
git:
url: https://github.com/SageMik/sqlite3-ohos.dart
path: sqlite3_flutter_libs
ref: sqlite3_flutter_libs-0.5.25-ohos
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')"
。
参阅 sqlite3 相关说明,通过 sqlite3.open()
或 sqlite3.openInMemory()
打开数据库。
final db = sqlite3.open('$filename');
如需启用结巴分词,请让数据库执行上一步的 jiebaDictSql
语句,以修改 Simple 扩展读取结巴分词字典的路径:
db.execute(jiebaDictSql);
推荐在正式查询前执行一次查询,提前加载,例如:
db.select("SELECT jieba_query('Jieba分词初始化(提前加载避免后续等待)')");
请参阅 SQLite FTS5 Extension 和 Simple 的说明,根据需要调用相应函数如 jieba_query
、simple_query
、highlight
、 simple_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
- HarmonyOS
- Linux
- 添加用户自定义字典。
Simple:支持中文和拼音的 SQLite FTS5 全文搜索扩展。
sqlite3.dart:SQLite3 的 Dart FFI 绑定。
extended_text:Flutter Text 的扩展组件,支持特殊文本效果。