Этот фрагмент кода по-прежнему актуален?
Это приведет к сбоям для Android 9+, так как getReadableDatabase приведет к созданию файлов -wal и -shm (WAL по умолчанию включен в Android 9+), которые помечены какпринадлежит новой базе данных. Новая база данных перезаписывается, но файлы -wal и -shm остаются. Копирование работает, но когда база данных открывается через SQliteOpenHelper, ошибка из-за существующих файлов -shm и -wal приводит к тому, что используемая база данных пуста, т. Е. Данные были стерты, и, как правило, приложение вылетает с таблицей, не найденной.
Единственная причина, я подозреваю, что использование getReadableDatabase или (getWritableDatabase без разницы, если нет катастрофы как таковой) использовалось исторически, заключается в том, что кто-то обнаружил, что он обошел OpenError ENOENT, когда он не был 'т использовал. Что делает база данных get ??? в рамках долгого и сложного процесса открытия базы данных, так это создает каталог баз данных, если он не существует.
Почему очевидное использование mkdirs не был использован, я понятия не имею.
Эффективный способ проверки и подготовки копии файла базы данных из ресурсов - это проверить, существует ли файл базы данных (если он существует, то нет необходимости копировать из активов), если он этого не делает. существующий, затем проверьте файл parentFile (папка баз данных), чтобы увидеть, существует ли он. Если он не существует, выполните mkdirs в родительском файле, а затем скопируйте файл.
- Нет необходимости открывать файл базы данных,
- нет генерации файлов -wal и -swm,
- нет базовой обработки для создания файла базы данных, -файл shm и файл -wal просто для их отбрасывания. -нет исчезновения трюков с таблицами.
/ data / data / com.packagename / database
В связи с проблемами возникло много проблем (в основном опечаток),Тем не менее, нет необходимости в сложном коде. Используйте Context getDatabasePath (dbname) для возврата пути. Единственный жесткий код (и это должно быть 1 место как константа) - это имя базы данных (DB_NAME в вашем случае).
Итак, у меня есть эта база данных размером около 7 МБ, и когда я впервые начал разрабатывать приложенияв 2014 году я прочитал, что я должен разделить базу данных на 1 МБ и поместить ее в папку ресурсов следующим образом: 01.db 02.db 03.db ... 07.db
Я недумаю, что это ограничение остается. Я считаю, что активы могут быть частью 100 Мб для APK, но большие данные можно обрабатывать с помощью расширенных APK.