Сначала я создал базу данных SQLite в Windows, а затем возникли проблемы с доступом к ней в Android.
Впоследствии я создал базу данных на Android, а затем скопировал ее. В этот момент в нем была только таблица android_metadata.
Затем я импортировал некоторые данные через CSV и добавил их обратно в свой проект. Класс DbHelper в моем проекте копирует базу данных в /data/data/my.project/databases/
.
Теперь, когда я запускаю необработанный запрос из этой базы данных, если я пытаюсь получить доступ к таблице, импортированной CSV, я получаю сообщение об ошибке, в котором говорится, что таблица не существует. Если я пытаюсь получить доступ к таблице android_metadata, которую я создал для Android, ошибка не возникает.
В базе данных в моих ресурсах определенно есть таблица, которую я хочу скопировать в папку /data/data/example.project/databases
, и определенно вызывается подпрограмма копирования - я проверил вывод журнала.
Теперь, если я закомментирую код копии, автоматически создается база данных, которая содержит таблицу android_metadata и составляет ~ 3 КБ.
Когда код копирования активен, база данных создается как ~ 8 КБ. Это размер базы данных в активах, поэтому кажется, что она была успешно скопирована. Однако, когда я извлекаю эту базу данных обратно на рабочий стол из DDMS, она составляет ~ 8 КБ, но в ней нет таблицы, которая находится в папке в папке ресурсов. Если я вручную скопирую прямо с рабочего стола в /data/data
..., тогда база данных будет работать (но это будет невозможно при использовании рыночного приложения).
Вот мой код для копирования базы данных:
public void createDatabase() throws IOException {
Log.i(TAG, "createDatabase called");
InputStream assetsDB = mContext.getAssets().open(DATABASE_NAME);
OutputStream dbOut = new FileOutputStream(DATABASE_PATH);
Log.i(TAG, DATABASE_PATH);
Log.i(TAG, assetsDB.toString());
byte[] buffer = new byte[1024];
int length;
while ((length = assetsDB.read(buffer))>0) {
Log.i(TAG, "WritingDB block" + length);
dbOut.write(buffer, 0, length);
}
dbOut.flush();
dbOut.close();
assetsDB.close();
}
Как я могу решить эту проблему?
Я исправил это, используя другой пример, который не переопределяет onCreate кодом копирования базы данных и обрабатывает копирование базы данных самостоятельно. Я не очень понимаю, почему это не работает при вызове метода onCreate.