Using room as singleton in kotlin

后端 未结 5 1299
被撕碎了的回忆
被撕碎了的回忆 2021-02-01 08:24

I\'m trying to use Room as singleton so I didn\'t have to invoke Room.databaseBuilder() -which is expensive- more than once.

@Database(entities = ar         


        
5条回答
  •  Happy的楠姐
    2021-02-01 09:22

    You could make use of the Kotlin standard library's

    fun  lazy(LazyThreadSafetyMode.SYNCHRONIZED, initializer: () -> T): Lazy
    companion object {
        private lateinit var context: Context
        private val database: AppDatabase by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
            Room.databaseBuilder(context, AppDatabase::class.java, "trains.db").build()
        }
        fun getDatabase(context: Context): AppDatabase {
            this.context = context.applicationContext
            return database
        }
    }
    

    Personally though, I would normally add ApplicationContext-dependent singletons inside the Application, e.g.

    
    
      
    ...
    
    class MyApplication : Application() {
        val database: AppDatabase by lazy {
            Room.databaseBuilder(this, AppDatabase::class.java, "train.db").build()
        }
    }
    

    You can even define an extension method for easy access as context.database.

    val Context.database
        get() =
            generateSequence(applicationContext) {
           (it as? ContextWrapper)?.baseContext
           }.filterIsInstance().first().database
    

提交回复
热议问题