Нет такой ошибки таблицы: таблицы sqlite (moor) создаются только после очистки данных приложения во Flutter
Я создаю базу данных, используя Moor для своего приложения flutter. Он имеет 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 таблицы для корзины и итога не создаются и выдают ошибку no such table при доступе к странице корзины.
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]
Я что-то упустил? Я также искал, есть ли ограничения для создания таблиц, но не нашел их. Поскольку moor работает, генерируя код с помощью build_runner, я также попытался очистить старую сборку и снова перестроить.
Поскольку приложение отлично работает на эмуляторе и на устройстве после очистки данных, я предполагаю, что мой код верен. В чем может быть проблема?
1 ответ
Так что проблема была не в мооре или моем коде. Поскольку приложение еще не выпущено, а я все еще вношу изменения в базу данных, я не хотел вносить изменения в версию схемы и предоставлять стратегию миграции.
Насколько я понимаю, база данных будет удалена при удалении приложения, и любые изменения, внесенные в базу данных, будут новой схемой для приложения в следующий раз, когда я его установлю. Это не относится к делу. По крайней мере, не всегда.
Оказывается, Google Диск создает резервную копию файла базы данных вашего приложения на некоторых устройствах и восстанавливает его при переустановке приложения. Это то, что вызывало странное поведение в моем приложении.