Если база данных не существует, вы затем используете this.getReadableDatabase (); , которая создаст базу данных, и, поскольку вы, вероятно, ничего не сделали в методе onCreate, база данных пуста.
Затем вы перезаписываете диск копией, однако, поскольку база данных все еще открыта (this.getReadableDatabase();
), пустая база данных без таблиц может быть полностью сохранена в кеше, и, следовательно, проблема.
Использованиеозначает, что открыть базу данных, когда база данных не существует, - это попытка обойти проблему, связанную с ошибкой копирования, когда она является первой базой данных, и на этом этапе хранилище приложения не имеет каталога с именем database (открытие открывает каталог).
- Обратите внимание, что в большинстве случаев getReadableDatabase получит доступную для записи базу данных.
Лично я предпочитаю и не сталкивался с какими-либо проблемами., по: -
- Никогда не кодируйте путь к базе данных жестко, скорее всегда используйте метод Context getDatabasePath .Например: -
mDBPath = context.getDatabasePath(database).getPath();
Проверка, существует ли файл базы данных, чтобы увидеть, существует ли база данных, вместо открытия базы данных, чтобы увидеть, существует ли она.(см. пример для 3)
Проверка родительского элемента базы данных (то есть папки базы данных), чтобы определить, существует ли она, и если не используется метод File mkdirs длясоздать каталог баз данных.например: -
private boolean ifDatabaseExists(String dbpath) {
File db = new File(dbpath);
if(db.exists()) return true;
File dir = new File(db.getParent());
if (!dir.exists()) {
dir.mkdirs();
}
return false;
}
Копирование базы данных из активов в расположение, указанное путем, полученным в 1.
Как часть 4 я получаю файл ресурса, проверьте первые 16 байтов, чтобы увидеть, является ли это действительной базой данных SQLite (должен быть «формат SQLite 3 \ u0000»).
а затем перейдите к копированию базы данных из ресурса в файл базы данных.