我正在为我的Flutter应用程序使用Moor创建一个数据库。它有5个表和相应的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;
}
当我在模拟器上运行该应用程序时,一切正常。所有表均已正确创建。当我在实际设备上运行应用程序时发生错误。可以很好地创建3个表,并按预期从云中填充数据。未创建购物车和总计的其他2个表,并且在访问购物车页面时抛出没有这样的表错误。
I/flutter ( 5321): Moor: Sent SELECT * FROM cart WHERE name != ? with args [Total]
E/SQLiteLog( 5321): (1) no such table: cart
也不会显示在应用程序启动时运行的数据库更新服务中的日志记录。 一旦我从设备上的“应用程序信息”部分清除了应用程序数据并再次启动该应用程序,一切都会恢复正常。
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]
我在这里错过了什么吗?我还搜索了创建表是否有任何限制,但找不到任何限制。由于停泊是通过使用build_runner生成代码来完成的,因此我还尝试清除旧版本并再次重建。
由于清除数据后,该应用程序可以在模拟器和设备上正常运行,因此我认为我的代码是正确的。可能是什么问题?
答案 0 :(得分:0)
所以问题不在于停泊或我的代码。由于该应用程序尚未发布,并且我仍在更改数据库,因此我不想更改架构版本并提供迁移策略。
我的理解是,数据库将在应用程序卸载时被删除,并且对该数据库所做的任何更改将成为我下次安装应用程序时的新架构。事实并非如此。并非总是如此。
结果 Google云端硬盘在某些设备上备份应用的数据库文件,并在应用重新安装时将其还原。这就是导致我的应用出现异常行为的原因。
这里是 github issue 的链接,以进行详细说明。