Вопрос по android, database – [Android SDK] Не удается скопировать внешнюю базу данных (13 МБ) из активов

2

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

Using your own SQLite database in Android applications how to copy large database which occupies much memory from assets folder to my application? Load files bigger than 1M from assets folder

Но мне не повезло, он продолжает давать мнеэта ошибка на линии

os.write(buffer, 0, len);

но я не могу понять почему. Здеськод функции иконстанты Я использую. Странно то, что моя база данных перестает копировать после 11,45 МБ, всего в 1 МБ от цели.

Может кто-нибудь помочь мне решить это? Большое спасибо :)

Посетите этот Q и A:stackoverflow.com/questions/4447477/… Ali Behzadian Nejad
Ошибка в том, что вы не проверяетеlen прежде чем использовать его вwrite. len является-1 в конце потока, и это недопустимый индекс. Используйте цикл while @ gtumca-MAC в следующий раз, когда вы копируете потоки, и вы в безопасности. zapl

Ваш Ответ

4   ответа
2
private void copyDataBase() throws IOException {
    AssetManager am = getAssets();
   OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);

    byte[] b = new byte[1024];
    String[] files = am.list("");
    Arrays.sort(files);
    int r;
    for (int i = 1; i <=21; i++) {
        InputStream is;

        if ( i < 10){
            System.out.println("coping file demoDB.sqlitedb.00"+i );
             is = am.open("demoDB.sqlitedb.00" + i);
        }else{
            System.out.println("coping file demoDB.sqlitedb.0"+i );
             is = am.open("demoDB.sqlitedb.0" + i);
       }
        while ((r = is.read(b)) != -1) {
            os.write(b, 0, r);
        }
        is.close();
    }
    os.close();
}
4

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

Error: User Rate Limit Exceeded tiwiz
4

по умолчанию папка ресурсов поддерживает максимальный размер файла базы данных 1 МБ.

Вам нужно разделить вашу базу данных на части.

СкачатьHJSplit и разделить вашу базу данных на мелкие части как 13 МБ = 13 частей каждая из 1 МБ.

demoDB.sqlitedb = 13 МБ затем

demodb..sqlitedb.001
demodb..sqlitedb.002
demodb..sqlitedb.003
demodb..sqlitedb.004
...
...
demodb..sqlitedb.013

Затем используйте следующий код для объединения вашей базы данных.

private void copyDataBase() throws IOException {
        AssetManager am = mContext.getAssets();
        OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
        byte[] b = new byte[1024];
        String[] files = am.list("");
        Arrays.sort(files);
        int r;
        for (int i = 1; i <= 9; i++) {
            InputStream is = am.open("demoDB.sqlitedb.00" + i);
            while ((r = is.read(b)) != -1) {
                os.write(b, 0, r);
            }
            Log.i("BABY_DATABASE_HELPER", "Copying the database (part " + i
                    + " of 9)");
            is.close();
        }
        os.close();
    }
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded tiwiz
Error: User Rate Limit Exceeded tiwiz
Error: User Rate Limit Exceeded
1

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

InputStream is = mContext.createPackageContext("com.activities.tests", Context.CONTEXT_IGNORE_SECURITY).getAssets().open("mydb.db");

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

Error: User Rate Limit Exceeded tiwiz

Похожие вопросы