Flfter sqflite: база данных нестабильна после горячей перезагрузки - PullRequest
0 голосов
/ 04 мая 2020

У меня есть следующий код

  Future<InitData> getInitialData() async {
    print('OPENING');
    await open();
    print('DB = $_db ${_db.isOpen}');
    final rawDayActionTypes = await _db.query(...);

Где открыта функция:

  Future<Database> open() async {
    if (_db != null && _db.isOpen) {
      return _db;
    }

    final dbPath = await sql.getDatabasesPath();
    final myDBPath = path.join(dbPath, db_name);
    _db = await sql.openDatabase(myDBPath, onCreate: _onCreateDB, version: 1);
    return _db;
  }

Но после горячей перезагрузки часто появляется следующая ошибка:

I/flutter (10806): DB = 1161 <db_name>.db true
E/flutter (10806): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: DatabaseException(error database_closed)
E/flutter (10806): #0      SqfliteDatabaseMixin.checkNotClosed 
package:sqflite_common/src/database_mixin.dart:282
E/flutter (10806): #1      SqfliteDatabaseExecutorMixin._rawQuery 
package:sqflite_common/src/database_mixin.dart:125
E/flutter (10806): #2      SqfliteDatabaseExecutorMixin.query 
package:sqflite_common/src/database_mixin.dart:110
E/flutter (10806): #3      DBService.getInitialData 
package:productive_diary/db/db_service.dart:56
E/flutter (10806): <asynchronous suspension>
E/flutter (10806): #4      _InitDBDataState._fetchData 
package:productive_diary/initScreen.dart:53
E/flutter (10806): #5      _InitDBDataState.didChangeDependencies 

Как видите, БД была открыта (DB = 1161 <db_name>.db true) в строке перед выполнением запроса (await _db.query(...);)

Если вам необходимо знать, что _InitDBDataState делает, чтобы понять контекст ошибки, Вы можете проверить этот связанный вопрос

1 Ответ

1 голос
/ 05 мая 2020

sqflite поддерживает горячий перезапуск, находя открытую базу данных, если таковая имеется (т.е. перезапускается сторона дротика, но собственная база данных все еще открыта). Горячая перезагрузка не должна вызывать каких-либо проблем.

Единственное, о чем я могу подумать, это если у вас где-нибудь есть вызов _db.close(). В типичном сценарии с одной базой данных вы должны просто открыть базу данных при запуске и никогда не закрывать ее.

Если вы находитесь в этом сценарии, можете ли гарантировать, что close () никогда не вызывается? (и попробуйте прокомментировать этот код)

...