Вкладыш флаттера висят на изоляте - PullRequest
0 голосов
/ 20 марта 2020

Когда я создаю базу данных, я хочу инициализировать ее с кучей данных.

У меня есть следующий сервис инициализации.

// This needs to be a top-level method because it's run on a background isolate
DatabaseConnection _backgroundConnection() {
  // construct the database. You can also wrap the VmDatabase in a "LazyDatabase" if you need to run
  // work before the database opens.
  final database = VmDatabase.memory();
  return DatabaseConnection.fromExecutor(database);
}
Future<void> _initDatabase(Map<String, dynamic> args) async {
  var moorIsolate = await MoorIsolate.spawn(_backgroundConnection);
  var connection = await moorIsolate.connect();
  var db = BillingDatabase.connect(connection);
  _initBillingSpecialties(db, args["specialties"]);
}

Future<void> _initBillingSpecialties(BillingDatabase db, String specialtiesJson) async {
  var json = jsonDecode(specialtiesJson);
  var jsonSpecialties = json["specialties"] as List<dynamic>;
  var specialities = jsonSpecialties.map((s) =>
      DbSpecialtiesCompanion(name: Value(s["specialty_name"]),
          mohNumber: Value(s["moh_specialty"]))).toList();
  return db.specialtyDao.saveAllSpecialties(specialities);
}

@injectable
class InitDbService {

  Future<void> initDatabase() async {
    WidgetsFlutterBinding.ensureInitialized();
    var specialties = await rootBundle.loadString("lib/assets/billing_specialties.json");
    compute(_initDatabase, {"specialties": specialties});
    //initDbSync(specialties);
  }

  Future<void> initDbSync(String specialtiesJson) async {
    var json = jsonDecode(specialtiesJson);
    var jsonSpecialties = json["specialties"] as List<dynamic>;
    var specialities = jsonSpecialties.map((s) =>
        DbSpecialtiesCompanion(name: Value(s["specialty_name"]),
            mohNumber: Value(s["moh_specialty"]))).toList();
    var dao = GetIt.instance.get<SpecialtyDao>();
    return dao.saveAllSpecialties(specialities);
  }
} 

initDbSync работает и вставляет просто отлично. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. В данный момент он печатает отчеты журнала, чтобы я мог видеть, что он делает.

Обновление: я обнаружил, что VmDatabase.memory (logStatements: true); было необходимо, чтобы увидеть SQL. Я вижу, как это печатает заявления.

Я бегу на симуляторе, чтобы я мог посмотреть на сырой файл БД И там ничего нет. Когда я делаю запрос в приложении, там тоже ничего нет.

1 Ответ

0 голосов
/ 20 марта 2020

Так что в документации не совсем ясно, что VmDatabase.memory(); открывает новую базу данных в памяти. Не извлекает базу данных из памяти.

Вы хотите взять ссылку на файл, который вы передаете в конструктор, и использовать

VmDatabase(File(dbFile));

, тогда он действительно будет работать на вашем sql ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...