Search code examples
androidandroid-sqliteandroid-roomandroid-room-prepackageddatabase

How to use Room Persistence Library with pre-populated database?


I'd like to use Room with a pre-populated database, but I can't understand how to tell Room where to find my database.

I've now put it in src/main/assets/databases and when I create the instance for the Room database I create it this way:

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

This way tho, I think it's creating a new database every time, or anyways, it's not using the pre-populated one.

How can I make it to find my database?


Solution

  • This is how I solved it, and how you can ship your application with a pre-populated database (up to Room v. alpha5)

    • put your SQLite DB database_name.db into the assets/databases folder

    • take the files from this repo and put them in a package called i.e. sqlAsset

    • in your AppDatabase class, modify your Room's DB creation code accordingly:

      Room.databaseBuilder(context.getApplicationContext(), 
                           AppDatabase.class, 
                           "database_name.db")
      .openHelperFactory(new AssetSQLiteOpenHelperFactory())
      .allowMainThreadQueries()
      .build();
      

    Note that you have to use "database_name.db" and not getDatabasePath() or other methods: it just needs the name of the file.