0

Android Room 文档说我们在实例化 AppDatabase 对象时应该遵循单例设计模式。

我正在考虑它,我想知道是否建议将 AppDatabase 类放在我的 Application 类中。或者,如果我可以为此使用 Kotlin 单例。

假设我有一个名为 CarroDAO 的 DAO 和作为 RoomDatabase 的类 CarrosDatabase。

可以使用 Kotlin 对象/单例创建 DatabaseManager 类吗?

object DatabaseManager {
    private var dbInstance: CarrosDatabase

    init {
        val appContext = MyApplication.getInstance().applicationContext

        dbInstance = Room.databaseBuilder(
                appContext,
                CarrosDatabase::class.java,
                "mybd.sqlite")
                .build()
    }

    fun getCarroDAO(): CarroDAO {
        return dbInstance.carroDAO()
    }
}

所以我可以像这样得到DAO类:

val dao = DatabaseManager.getCarroDAO()
4

1 回答 1

1

根据Android文档,我们可以使用单例设计模式创建一个数据库实例,如下创建一个房间数据库实体

@Entity
data class User(
    @PrimaryKey var uid: Int,
    @ColumnInfo(name = "first_name") var firstName: String?,
    @ColumnInfo(name = "last_name") var lastName: String?
)

创建 DAO 类

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE:  first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

使用单例模式创建数据库

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao

    companion object {
        @Volatile
        private var instance: AppDatabase? = null

        fun getInstance(
            context: Context
        ): AppDatabase = instance ?: synchronized(this) {
            instance ?: buildDatabase(context).also { instance = it }
        }

        private fun buildDatabase(context: Context): AppDatabase {
            return Room.databaseBuilder(
                context,
                AppDatabase::class.java,
                "database-name"
            ).build()
        }
    }
}

您可以通过以下代码获取数据库实例

 var databaseInstance=AppDatabase.getInstance(context)
于 2019-02-23T12:50:07.403 回答