Как использовать библиотеку сохранения пространства с предварительно заполненной базой данных?
Я хотел бы использовать Room с предварительно заполненной базой данных, но я не могу понять, как рассказать Room, где можно найти мою базу данных.
Теперь я помещаю его в src/main/assets/databases
и когда я создаю экземпляр для базы данных Room, я создаю его следующим образом:
Room.databaseBuilder(
getApplicationContext(),
AppDatabase.class,
"justintrain.db"
)
.allowMainThreadQueries()
.build();
Таким образом, я думаю, что каждый раз создавая новую базу данных, или, во всяком случае, он не использует предварительно заполненный.
Как я могу найти его в моей базе данных?
Ответы
Ответ 1
Вот как я это решил и как вы можете отправить свое приложение с предварительно заполненной базой данных (до номера v. alpha5)
-
поместите ваш SQLite DB database_name.db
в папку assets/databases
-
возьмите файлы из этого репо и поместите их в пакет под названием i.e. sqlAsset
-
в вашем классе AppDatabase
, соответствующим образом измените код создания номера комнаты:
Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class,
"database_name.db")
.openHelperFactory(new AssetSQLiteOpenHelperFactory())
.allowMainThreadQueries()
.build();
Обратите внимание, что вам нужно использовать "database_name.db"
, а не getDatabasePath()
или другие методы: ему просто нужно имя файла.
Ответ 2
У меня была такая же проблема, поэтому я создал библиотеку, которая делает именно это. принятая работа с ответом, но я считаю, что проще использовать библиотеку.
AppDatabase db = RoomAsset
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database_name.db")
.build();
Добавьте его в свой root build.gradle в конце репозиториев:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Добавить зависимость
dependencies {
// ... other dependencies
implementation 'com.github.humazed:RoomAsset:v1.0'
}
вы можете найти здесь библиотеку: https://github.com/humazed/RoomAsset
Ответ 3
Простое решение без каких-либо других внешних библиотек.
Для создания или открытия базы данных Room использует существующий код платформы Android. Если вы посмотрите на исходный код FrameworkSQLiteOpenHelper
(комнатная версия SQLiteOpenHelper
), он внутренне вызывает SQLiteOpenHelper.getReadableDatabase()
и другие методы, где это необходимо.
Итак, самое простое решение - просто скопировать файл БД из каталога активов в mContext.getDatabasePath("my-database.sqlite")
перед созданием БД с Room.
В вашем случае код выглядит примерно так:
private final String DB_NAME = "my-database.sqlite";
private MyDatabase buildDatabase(Context context) {
final File dbFile = context.getDatabasePath(DB_NAME);
if(!dbFile.exists()) {
copyDatabaseFile(dbFile.getAbsolutePath());
}
return Room.databaseBuilder(context.getApplicationContext(),
MyDatabase.class, DB_NAME)
.build();
}
private void copyDatabaseFile(String destinationPath) {
// code to copy the file from assets/database directory to destinationPath
}
Эта ссылка содержит код, необходимый для копирования БД - ссылка с кодом
Ответ 4
вы просто скопируете assets/databases
в app/databases
и добавьте addMigrations()
в databaseBuilder
он будет хранить ваши данные