No such table error : sqlite (moor) tables created only after clearing app data in Flutter

No such table error : sqlite (moor) tables created only after clearing app data in Flutter

我正在使用 Moor 为我的 flutter 应用程序创建一个数据库。它有 5 tables 和相应的 DAO(数据访问对象)。

@UseMoor(
    tables: [Cart, CartTotal, Books, Subjects, Images],
    daos: [CartDao, CartTotalDao, BooksDao, SubjectsDao, SearchDao, ImagesDao])
class AppDatabase extends _$AppDatabase {
  AppDatabase()
      : super(FlutterQueryExecutor.inDatabaseFolder(
            path: 'db.sqlite', logStatements: true));

  @override
  int get schemaVersion => 1;
}

当我在模拟器上 运行 应用程序时,一切正常。所有 table 均已正确创建。当我在实际设备上 运行 应用程序时发生错误。 3 tables 创建良好,并按预期填充了来自云的数据。购物车和总计的其他 2 table 未创建,并在访问购物车页面时抛出 没有这样的 table 错误。

I/flutter ( 5321): Moor: Sent SELECT * FROM cart WHERE name != ? with args [Total]
E/SQLiteLog( 5321): (1) no such table: cart

我的数据库更新服务也没有显示应用程序启动时 运行s 的日志记录。 一旦我从设备上的应用信息部分清除了应用数据并再次启动该应用,一切又恢复正常了。

I/flutter ( 5717): Moor: Sent CREATE TABLE IF NOT EXISTS books (amazon_link VARCHAR NULL, author VARCHAR NOT NULL, cost INTEGER NOT NULL, cover_url VARCHAR NULL, description VARCHAR NULL, discounted_cost INTEGER NULL, flipkart_link VARCHAR NULL, isbn INTEGER NOT NULL, language VARCHAR NULL, name VARCHAR NOT NULL, pages INTEGER NULL, publication_number INTEGER NOT NULL, publication_status VARCHAR NOT NULL, youtube_link VARCHAR NULL, PRIMARY KEY (publication_number)); with args []
I/flutter ( 5717): Moor: Sent CREATE TABLE IF NOT EXISTS subjects (publication_number INTEGER NOT NULL, sub_name VARCHAR NOT NULL, PRIMARY KEY (publication_number, sub_name)); with args []
I/flutter ( 5717): Moor: Sent CREATE TABLE IF NOT EXISTS images (url VARCHAR NOT NULL, publication_number INTEGER NOT NULL); with args []
I/flutter ( 5717): Moor: Sent CREATE TABLE IF NOT EXISTS cart (name VARCHAR NOT NULL, quantity INTEGER NOT NULL, cost INTEGER NOT NULL, discounted_cost INTEGER NOT NULL, PRIMARY KEY (name)); with args []
I/flutter ( 5717): Moor: Sent CREATE TABLE IF NOT EXISTS cart_total (name VARCHAR NOT NULL, quantity INTEGER NOT NULL, cost INTEGER NOT NULL, discounted_cost INTEGER NOT NULL, PRIMARY KEY (name)); with args []

按预期打开购物车页面。

I/flutter ( 5717): Moor: Sent SELECT * FROM cart WHERE name != ? with args [Total]
I/flutter ( 5717): Moor: Sent SELECT * FROM cart_total WHERE name = ?; with args [Total]

我是不是漏掉了什么?我还搜索了创建 table 是否有任何限制,但找不到任何限制。由于 moor 通过使用 build_runner 生成代码来工作,我还尝试清除旧版本并再次重建。

由于清除数据后应用 运行 在模拟器和设备上运行良好,我假设我的代码是正确的。可能是什么问题?

所以问题不在于 moor 或我的代码。由于该应用程序尚未发布,我仍在对数据库进行更改,因此我不想更改架构版本并提供迁移策略。

我的理解是数据库将在应用程序卸载时被删除,并且对数据库所做的任何更改都将成为我下次安装应用程序时的新架构。事实并非如此。至少不总是。

原来 Google Drive 会在某些设备上备份您的应用程序的数据库文件,并在应用程序重新安装时恢复它。 这就是导致我的应用程序出现奇怪行为的原因。

这里有一个link到github issue的详细解释。