传统上,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
,新语法将在中工作