Sqflite во flutter, работает с двумя базами данных (прикрепить)

#sqlite #dart #flutter #sqflite

#sqlite #dart #flutter #sqflite

Вопрос:

У меня небольшая проблема с обработкой двух баз данных. Я использую flutter с dart и пакет sqlite sqflite.

Описание проблемы: У меня есть две базы данных в моем активе (assets / masterdata.db и assets / usr.db). В masterdata.db время от времени появляются новые данные, а в usr.db я сохраняю пользовательские данные. Я хочу копировать usr.db один раз и masterdata.db каждый раз, по крайней мере, при обновлении приложения.

Вопрос: Есть ли способ использовать «прикрепить базу данных» для двух баз данных и как я могу это сделать?

Вопрос 2: Или есть другой способ сохранить данные таблиц внутри usr.db при обновлении masterdata? Я хочу избежать написания 100 инструкций insert для новых masterdata в событии onUpdate. А также использование csv-файлов для новых данных звучит не очень разумно.

Заранее благодарю вас за любую подсказку.

Ответ №1:

В вашем вспомогательном модуле базы данных masterdata вы можете сделать что-то подобное, чтобы прикрепить базу данных

     Future<Database> attachDb({Database db, String databaseName, String databaseAlias}) async {
      Directory documentDirectory = await getApplicationDocumentsDirectory();
      String absoluteEndPath = join(documentDirectory.path, databaseName);
      await db.rawQuery("ATTACH DATABASE '$absoluteEndPath' as '$databaseAlias'");
      return db;
    }
  

Итак, когда вы инициализируете свою базу данных, вы можете запустить

     attachDb(
        db:db,
        databaseName:"usr.db",
        databaseAlias:"USER_DATABASE",
    );
  

Затем вы можете ссылаться на базу данных в своих запросах следующим образом

     db.rawQuery("SELECT * FROM USER_DATABASE.table_name");
  

Комментарии:

1. Примечание: при вызове attachDB() из другого места, пожалуйста, убедитесь, что добавлено await ключевое слово.