-
-
Save AdamMc331/5d48220875ce6b8bf0a0c0396ec8a0c0 to your computer and use it in GitHub Desktop.
@Database(...) | |
abstract class AppDatabase : RoomDatabase() { | |
abstract fun appDao(): AppDao | |
companion object { | |
private var INSTANCE: AppDatabase? = null | |
private set | |
fun getInMemoryDatabase(context: Context): CCDatabase { | |
if (INSTANCE == null) { | |
INSTANCE = Room.databaseBuilder(context, | |
AppDatabase::class.java, "app_database.db") | |
.addCallback(CALLBACK) | |
.build() | |
} | |
return INSTANCE!! | |
} | |
private val CALLBACK = object : RoomDatabase.Callback() { | |
override fun onCreate(db: SupportSQLiteDatabase) { | |
super.onCreate(db) | |
db.execSQL("CREATE TRIGGER ...") | |
} | |
} | |
} | |
} |
Here is the Java equivalent code for Room Database callbacks.
INSTANCE = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "app-database-db")
.addCallback(CALLBACK)
.build();
private RoomDatabase.Callback CALLBACK = new RoomDatabase.Callback(){
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
db.execSQL("CREATE TRIGGER ...")
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
}
};
Thanks a lot @AdamMc331!
The callback has to be saved as a variable, declaring it inside the callback didn't execute it at all for me.
The Kotlin way to handle the INSTANCE
singleton would be like this:
fun getDatabase(context: Context): CrosswordDatabase {
return INSTANCE ?: Room
.databaseBuilder(context.applicationContext, CrosswordDatabase::class.java, "crossword_database")
.addCallback(CALLBACK)
.build()
}
@carstenhag Your code snippet of handling singleton is missing the critical part of assigning the newly created object to the INSTANCE variable. Perhaps you could write .also {INSTANCE = it}
at the end.
Can I use INSTANCE in callback? Because I want to put some initial data which has to be added only once. If yes, is there any possibility to implement such with Dagger Hilt?
if you meant like pre-populating your db, for sure you can do that in here. i am not sure about Dagger Hilt, though.
Thanks a lot! i was looking for that solution :D
private val CALLBACK = object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
db.execSQL("CREATE TRIGGER ...")
}
}
Hello AdamMc331, can you provide the java equivalent of your code?
Thanks in advance