Копирование базы данных в ресурсы во внутренние базы данных Android не удается с первой попытки в эмуляторе - PullRequest
2 голосов
/ 02 августа 2011

У меня есть база данных (1,69 МБ) в активах, которую нужно скопировать во внутреннюю папку баз данных. Моя проблема в том, что для первой попытки БД копируется, но не с точными таблицами. В обозревателе файлов эмулятора он становится размером 3072 (3 КБ).

Когда я смотрю эту базу данных с помощью проводника sqlite, я не вижу свои таблицы. Единственная таблица в БД существует - это таблица android_metadata с одним столбцом информации о моей локали.

Но если я уберу этот дб из баз данных и перезапущу приложение, похоже, на этот раз работает. Почему он терпит неудачу с первой попытки? Как я могу быть уверен, что это не произойдет на реальных устройствах? Это ошибка с эмулятором?

1 Ответ

4 голосов
/ 03 августа 2011

наконец я пришел к выводу с помощью Нареша (спасибо). Вот краткое резюме: при первом запуске я пытался скопировать файл data.db объемом 1.6 Мб из ресурсов в папку /data.../databases, которой никогда не было Итак

OutputStream os = new FileOutputStream(destPath);

строка выдала ошибку. Но после этой строки мой экземпляр dbhelper называется getreadabledatabase, который создал папку баз данных по указанному пути. Android поместил БД с тем же именем, но без полезных данных. В моем методе copyDatabase я обновил его следующим образом:

InputStream is = getBaseContext().getAssets().open(assetsDB);

            //when there is no databases folder fileoutputstream gives error,
            //we have to make sure databases folder exists
            DbAdapter temp = new DbAdapter(getApplicationContext());
            temp.open();        //gets readable database: creates databases folder containing DB_NAME db
            temp.close();       //since we don use this temp, we close

            //this wont give error: because path is now exists (databases folder exists)
            OutputStream os = new FileOutputStream(destPath);

            //copying 1K bytes at a time
            byte[] buff = new byte[1024];

это решение, которое я придумала. Кстати, размер бывшей sdk из 2.3 базы данных активов должен быть меньше 1 МБ. Это еще одна проблема, и мы нашли решение здесь

...