Android SQLite Ошибка при загрузке файла с сервера - PullRequest
0 голосов
/ 08 ноября 2019

Таким образом, в настоящее время я сохраняю файлы резервных копий для своей базы данных sqlite на своем веб-сервере, проблема, с которой я сталкиваюсь, заключается в том, что при попытке загрузить и импортировать их в свой текущий телефон я получаю эту ошибку.

 database corruption at line 63697 of [c255889bd9]
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11)      Invalid First byte:0 of page:4
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11) Page      (4) content:
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11)  - 00      01 0F D1 00 0F D1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11)  - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11)  - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11)  - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2D 01 08 00 15 0F 0F 17 33 1B 33 2E 30 30 38 32 31 33
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11)  - 2E 39 35 32 30 31 39 2D 31 30 2D 32 37 20 31 35 3A 31 31 3A 34 39 32 34 37 31 35 39 34 00 00 00
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11) database corruption at line 63741 of [c255889bd9]
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp E/SQLiteLog: (11) statement aborts at 3: [SELECT * FROM table ORDER BY idx DESC] database disk image is malformed
 2019-11-07 18:01:20.615 26965-26965/com.my.testapp      E/DefaultDatabaseErrorHandler: !@ Corruption reported by sqlite (11) on      database: /data/user/0/com.my.testapp/databases/MY_DB
 2019-11-07 18:01:20.616 26965-26965/com.my.testapp E/SQLiteLog: (11)      Invalid type:0 for page:4

Ноесли я загружаю его на свой компьютер, а затем вручную перемещаю в папку, он импортируется очень хорошо. Что-то еще, что я должен сделать, когда я загружаю это? Вот код, который я использую для загрузки с помощью AsyncTask:

File BACKUP_FILE = new File (contextRef.getExternalFilesDir(null) + "/backup/" + DB_NAME);

        if (BACKUP_FILE.exists()) {
            if (BACKUP_FILE.delete()){
                Log.e("IFS", "Deleting previous backup: " + BACKUP_FILE);
            }
        }

        int count;
        byte data[] = new byte[4096];

        URL sUrl = new URL(URL_FOR_DOWNLOAD);
        HttpURLConnection connection = (HttpURLConnection) sUrl.openConnection();
        connection.connect();

        input = connection.getInputStream();
        output = new FileOutputStream(BACKUP_FILE);

        while ((count = input.read(data)) != -1)
        {
            if (isCancelled()) {
                input.close();
                return null;
            }

            output.write(data, 0, count);
        }
    }catch (Exception e){
        Log.e("IFS", "Error 127: " + e.getMessage());
    }

1 Ответ

0 голосов
/ 08 ноября 2019

Если база данных используется в режиме WAL (по умолчанию для Android 9+), то, если существующая база данных, которая перезаписывается, не была помечена контрольной точкой, файл -wal, который еще существует, может привести к такому сообщению.

Я бы посоветовал при восстановлении из резервной копии удалить файлы -shm и -wal. Однако для этого требуется, чтобы резервная копия была сделана, когда резервная копия базы данных была полностью проверена.

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

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