Flutter восстановление базы данных SQLite из Dropbox

#sqlite #flutter

#sqlite #flutter

Вопрос:

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

Я только что загрузил свой файл базы данных «database.db» в Dropbox, и мне удается загрузить файл обратно, но всякий раз, когда я пытаюсь открыть базу данных после загрузки, я получаю исключение, и кажется, что файл возвращается каким-то образом поврежденным. Должен ли я сохранять ее в Dropbox или загружать с некоторыми конкретными параметрами?

 E/SQLiteLog(16429): (26) file is not a database
D/SQLiteConnection(16429): Corruption detected - isPrimary: true, address: @2e80143
E/SQLiteDatabase(16429): Failed to open database '/data/user/0/com.testdropbox.test/app_flutter/database.db'.
E/SQLiteDatabase(16429): android.database.sqlite.SQLiteDatabaseCorruptException: file is not a database (code 26 SQLITE_NOTADB[26]): , while compiling: PRAGMA journal_mode
  
 Future downloadTest() async {
    if (await checkAuthorized(authorize: true)) {
      Directory docsDirectory =
          await pathProvider.getApplicationDocumentsDirectory();
      String dbPath = join(docsDirectory.path, DB_NAME);

      await _dbService.closeDb();

      final result =
          await Dropbox.download('/db/$DB_NAME', dbPath, (downloaded, total) {
        print('progress $downloaded / $total');
      });

      print(result);
      print(io.File(dbPath).statSync());
      await _dbService.openDb();
    }
  }

Future uploadTest() async {
    if (await checkAuthorized(authorize: true)) {
      io.Directory docsDirectory =
          await pathProvider.getApplicationDocumentsDirectory();
      String filepath = join(docsDirectory.path, DB_NAME);

      io.File(filepath).writeAsStringSync(
          'contents.. from '   (io.Platform.isIOS ? 'iOS' : 'Android')   'n');

      final result =
          await Dropbox.upload(filepath, '/db/$DB_NAME', (uploaded, total) {
        print('progress $uploaded / $total');
      });
      print(result);

      var _content = await listFolder('');
      print(_content);
    }
  }
  

Ответ №1:

Хорошо, мои объяснения по этому поводу, я перепутал переменную с путем и записывал текст и перезаписывал файл базы данных перед загрузкой dropbol в этой строке:

 io.File(filepath).writeAsStringSync(
          'contents.. from '   (io.Platform.isIOS ? 'iOS' : 'Android')   'n');