Нет такой ошибки таблицы: таблицы sqlite (moor) создаются только после очистки данных приложения во Flutter - PullRequest
0 голосов
/ 24 октября 2019

Я создаю базу данных, используя 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]

Я что-то здесь упускаю? Я также искал, есть ли какие-либо ограничения для создания таблиц, но не мог найти какие-либо. Поскольку moor работает, генерируя код с помощью build_runner, я также попытался очистить старую сборку и заново собрать ее.

Поскольку приложение работает нормально на эмуляторе и на устройстве после очистки данных, я предполагаю, что мой код правильный. В чем может быть проблема?

1 Ответ

0 голосов
/ 25 октября 2019

Так что проблема была не в мавре или моем коде. Поскольку приложение еще не выпущено, и я все еще делаю изменения в базе данных, я не хотел вносить изменения в версию схемы и предоставлять стратегию миграции.

Насколько я понимаю, база данных будет удалена при удалении приложения, и любые изменения, внесенные в базу данных, будут новой схемой для приложения при следующей установке. Это не относится к делу. По крайней мере не всегда.

Получается Google Drive создает резервную копию файла базы данных вашего приложения на некоторых устройствах и восстанавливает его при переустановке приложения. Именно это и вызывает странное поведение в моем приложении.

Вот ссылка на выпуск github для подробного объяснения.

...