【问题标题】:Flutter SQLite Database enforcing strict data typesFlutter SQLite 数据库强制执行严格的数据类型
【发布时间】:2022-01-26 01:37:11
【问题描述】:

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

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

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

未处理的异常:DatabaseException(“STRICT”附近:语法错误(代码 1 SQLITE_ERROR)

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

编辑---

flutter sqflite 包似乎使用了 android/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版本了吗?
  • 我没有直接用sqlite,我用的是最新的flutter包sqflite 2.0.1
  • 执行查询:select sqlite_version();,查看返回值。
  • 你不能在颤振包 sqflite 2.0.1 中输入原始选择命令
  • You can,使用rawQuery方法

标签: database flutter sqlite strict


【解决方案1】:
  • 检查 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 并且新语法将起作用

【讨论】:

  • 谢谢你,看来 sqflite 包使用了平台上可用的 SQLite 版本。它不提供/捆绑任何额外的 SQLite 库。您的上述建议确实将 sqlite 更新到最新版本,但 databaseFactory 类不支持 STRICT 数据类型,因为当我尝试添加严格操作数时,它会创建格式错误的数据库模式。
猜你喜欢
  • 2018-08-20
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2023-03-08
  • 2020-03-18
  • 2011-01-22
  • 2023-04-10
相关资源
最近更新 更多