如何在Flutter的Sqflite插件中加载SQLite的json1扩展
Flutter 2.0.6搭配sqflite 2.0.0+3启用SQLite json1扩展解决方案
你当前使用的SQLite 3.28.0本身已经内置json1扩展,无需额外加载扩展文件,无法使用相关函数的核心原因是sqflite插件编译时未开启JSON1功能的编译选项,可通过以下方案解决:
方案1:降级sqflite到兼容版本
1.2.1版本的sqflite默认开启了JSON1编译选项,无需额外配置即可直接使用json_object()、json_group_array()等函数,适配步骤如下:
- 打开项目根目录的
pubspec.yaml文件,修改sqflite依赖版本:dependencies: sqflite: 1.2.1 - 执行命令
flutter pub get更新依赖 - 清理项目缓存后重新构建即可生效
方案2:高版本sqflite自定义编译参数
如果不想降级sqflite版本,可以分别给安卓、iOS端添加编译参数开启JSON1支持:
安卓端配置
- 打开
android/app/build.gradle文件,在defaultConfig块中添加如下配置:ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64' } packagingOptions { pickFirst 'lib/x86_64/libsqlite3x.so' pickFirst 'lib/arm64-v8a/libsqlite3x.so' pickFirst 'lib/armeabi-v7a/libsqlite3x.so' } - 打开
android/gradle.properties文件,添加全局编译参数:sqflite.sqliteFlags=-DSQLITE_ENABLE_JSON1=1 - 重新构建安卓项目即可
iOS端配置
- 打开
ios/Podfile文件,添加post_install钩子配置:post_install do |installer| installer.pods_project.targets.each do |target| if target.name == 'sqflite' target.build_configurations.each do |config| config.build_settings['OTHER_CFLAGS'] ||= ['$(inherited)'] config.build_settings['OTHER_CFLAGS'] << '-DSQLITE_ENABLE_JSON1' end end end end - 进入ios目录执行命令
pod install更新依赖配置 - 重新构建iOS项目即可
方案3:使用sqflite_common_ffi替代原生sqflite
如果上述配置都不生效,可以使用基于FFI实现的sqflite版本,默认开启所有SQLite扩展功能,适配成本极低:
- 修改
pubspec.yaml依赖:dependencies: sqflite_common_ffi: ^2.0.0 - 在应用入口初始化FFI实现,原有数据库操作代码无需任何修改:
import 'package:sqflite_common_ffi/sqflite_ffi.dart'; void main() { // 初始化sqflite FFI实现 sqfliteFfiInit(); databaseFactory = databaseFactoryFfi; runApp(YourApp()); }
功能验证
配置完成后可以执行测试SQL确认功能生效:
var result = await db.rawQuery("SELECT json_object('id', 1, 'name', 'test') as json_res"); // 正常返回 [{json_res: {"id":1,"name":"test"}}] 即说明配置成功
内容的提问来源于stack exchange,提问作者Tom Shen
相关产品推荐
相关产品推荐

