Подтвердить что ты не робот

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

Я хотел бы использовать Room с предварительно заполненной базой данных, но я не могу понять, как рассказать Room, где можно найти мою базу данных.

Теперь я помещаю его в src/main/assets/databases и когда я создаю экземпляр для базы данных Room, я создаю его следующим образом:

Room.databaseBuilder(
    getApplicationContext(),
    AppDatabase.class,
    "justintrain.db"
)
.allowMainThreadQueries()
.build();

Таким образом, я думаю, что каждый раз создавая новую базу данных, или, во всяком случае, он не использует предварительно заполненный.

Как я могу найти его в моей базе данных?

4b9b3361

Ответ 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
он будет хранить ваши данные