【问题标题】:Room database class initialization房间数据库类初始化
【发布时间】:2019-10-11 11:22:15
【问题描述】:
val db = Room.databaseBuilder(
        applicationContext,
        AppDatabase::class.java, "database-name"
    ).build()

是否必须在 mainactivity 中使用上述代码创建数据库类的实例?在安卓房间里?

【问题讨论】:

  • 您在某处需要该代码。 MainActivity 将是一个不寻常的选择。对于小型单屏应用程序,您可能会将其放在 ViewModel 子类中。对于较大的项目,一种典型的方法是使用一个存储库类,将数据库 I/O 隐藏在 UI 层之外。
  • 您必须在 Repository 类 中初始化 ROOM 数据库,所有任务都在其中执行,如 insertTask、updateTask、deleteTask 等。
  • 你可以阅读这篇文章stackoverflow.com/questions/45912619/…

标签: android kotlin android-room


【解决方案1】:

您可以拥有单例数据库类并在整个应用程序中直接使用它。无需一次又一次地创建它的实例。

当您需要 DB 对象时,只需像下面这样使用它

  db = AppDatabase.getInstance(activity.applicationContext)

单例类

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.sqlite.db.SupportSQLiteDatabase

@Database(
    entities = [Abc::class],
    version = 1,
    exportSchema = false
)

@TypeConverters(CustomTypeConvertes::class)
abstract class AppDatabase : RoomDatabase() {

    abstract fun abcDao(): AbcDao

    companion object {

        private var INSTANCE: AppDatabase? = null

        private val lock = Any()

        fun getInstance(context: Context): AppDatabase {
            synchronized(lock) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java, "database-name"
                    ).addCallback(object : RoomDatabase.Callback() {
                        override fun onCreate(db: SupportSQLiteDatabase) {
                            Console.debug("database-name", "Database created")
                            super.onCreate(db)
                        }

                        override fun onOpen(db: SupportSQLiteDatabase) {
                            Console.debug("database-name", "Database opened")
                            super.onOpen(db)
                        }
                    })
                        .fallbackToDestructiveMigration()
                        .build()
                }
                return INSTANCE!!
            }
        }
    }

}

【讨论】:

  • 请不要使用这个,伴生对象已经是单例了。在这种情况下,您将在单例中创建一个单例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多