Flutter SQLite数据库强制执行严格的数据类型



传统上,sqlite允许将任何数据类型提交到数据库表中的任何字段,例如,您可以将INTEGER提交到TEXT字段。然而,自sqlite 3.37.0以来,现在正式支持严格的表数据类型。例如,如果创建了一个严格的表,则不能向TEXT字段提交INTEGER。

flutter sqflite包不断抛出一个错误,无法识别STRICT操作数。

CREATE TABLE table_name(field_one INTEGER, field_two TEXT) STRICT;

未处理的异常:数据库异常(接近"STRICT":语法错误(代码1 SQLITE_error(

当使用sqflite包在flutter中创建sqlite表时,有人能够强制执行严格的数据类型吗?

编辑---

看来flutter sqflite包使用的是安卓/ios设备上预装的任何sqlite版本。Flutter sqflite包不提供/捆绑任何额外的sqlite库,因此设备运行的是不支持STRICT数据类型的旧版本sqlite。

@Pavel提供了一种在android/ios设备上安装最新版本sqlite的方法。使用如下所示的代码,它确实安装了最新版本的sqlite,但它仍然不允许您创建STRICT数据库表。当您执行代码时,它创建了一个格式错误的数据库表,该表已损坏。

import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
sqfliteFfiInit();

var db = await databaseFactoryFfi.openDatabase(inMemoryDatabasePath);
await db.execute('''
CREATE TABLE Product (
field_one INTEGER,
field_two TEXT
) STRICT
''');
  • 检查sqlite版本
db.rawQuery('select sqlite_version();').then(print);

这将打印系统提供的sqlite版本,例如

[{sqlite_version(): 3.22.0}]
  • 在您的应用程序中捆绑最新的sqlite版本
sqlite3_flutter_libs: ^0.5.2 # sqlite 3.37.0
  • 告诉sqflite使用它:
sqflite_common_ffi: ^2.1.0 # for sqflite config
void main() {
WidgetsFlutterBinding.ensureInitialized();
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
runApp(...);
}

现在select sqlite_version();将返回3.37.0,新语法将在中工作

最新更新