Копирование базы данных в активах во внутренние базы данных Android не удается с первой попытки в эмуляторе

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

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

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


person Fredrick Gauss    schedule 02.08.2011    source источник
comment
Если вы выполните PRAGMA user_version; запрос в вашей базе данных в активах, какова ценность, которую вы получаете? Если это недопустимое значение, класс SqliteOpenHelper будет вызывать onCreate, который удалит все существующее и создаст новое. когда вы создаете SqliteOpenhelper до или после копирования?   -  person Naresh    schedule 02.08.2011
comment
спасибо за быстрый повтор, PRAGMA user_version дает мне 0. я никогда не слышал об этом. Что делать с этим нулем? В моем приложении я создаю SqliteOpenHelper сразу после копирования базы данных. Итак, если это так, что мне делать? Почему при следующих попытках он не удаляет мои таблицы? Кстати, мои методы sqliteopenhelper onCreate, onUpgrade пусты.   -  person Fredrick Gauss    schedule 02.08.2011
comment
Добавьте несколько журналов и посмотрите, вызывается ли по какой-то причине этот метод при первом копировании базы данных. Если это так, возможно, вы можете просто поместить туда свой код копирования. Также вы уверены, что вам удалось скопировать?   -  person Naresh    schedule 02.08.2011
comment
странно, я понял, что мой код копирования начал не работать. Я просто пишу: String destPath = /data/data/ + getPackageName() + /databases/ + DbAdapter.DATABASE_NAME; OutputStream os = новый FileOutputStream (путь назначения); но это дает мне следующие ошибки, начиная с исключения файла, не найденного. Какие детали мне не хватает, потому что это работало раньше? java.io.FileNotFoundException: /data/data/com.databasetrial.it/databases/mydata.db примечание: я обновляю свою базу данных с помощью PRAGMA user_version = 1   -  person Fredrick Gauss    schedule 02.08.2011
comment
Я считаю, что папка баз данных может быть не создана к тому времени, когда вы пытаетесь скопировать файл. поскольку у него нет доступа для создания каталога, он может дать сбой. посмотрите, можете ли вы сначала создать каталог баз данных, а затем попытаться скопировать.   -  person Naresh    schedule 02.08.2011


Ответы (1)


наконец, я пришел к выводу с помощью Нареша (спасибо). Вот краткое резюме: при первом запуске я пытался скопировать файл 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 Мб. Это другая проблема, и решение найдено здесь

person Fredrick Gauss    schedule 03.08.2011