【问题标题】:Room database setup in Android Library moduleAndroid 库模块中的房间数据库设置
【发布时间】:2020-06-04 08:33:27
【问题描述】:

我有一个现有的 Android 项目,我在其中创建了一个新的 Android Library (offlineservicelibrary)(File/new/New module/Android library)。在这个库中,我想创建一个房间数据库。

我关注 https://developer.android.com/training/data-storage/room 并为我的数据库创建了 Entity (OfflineData) 和 DAO(OfflineDataDao) 设置,但我对在哪里设置 AppDatabase 以及如何将其链接到库有点困惑。

@Database(entities = arrayOf(OfflineData::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun getOfflineDataDao(): OfflineDataDao
}

val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()

在我的库中,我没有任何扩展应用程序类的类。我是否应该创建一个扩展 Application 类的新类并在那里执行上述步骤。

请建议我应该怎么做才能使用 Room 数据库设置图书馆

这是我的图书馆项目结构

【问题讨论】:

  • 你可以在库模型中创建单例,当其他模块需要查询数据库时,如果需要,你应该传递上下文来初始化你的数据库。
  • 我不应该创建一个扩展应用程序的类吗?
  • 基本上还可以,但是如果另一个模块需要上下文怎么办?所以你不能制作更多的自定义应用程序吗?
  • 你能举个例子说明如何做到这一点

标签: android android-room android-library


【解决方案1】:
  1. 在你的模块中创建DatabaseManager Singleton 类。使用@JvmStatic 帮助您在没有Companion 的情况下从Java 调用
class DatabaseManager private constructor(private val dp: AppDatabase) {
    fun loadData() : List<OfflineData> {
        return dp.getOfflineDataDao().loadAll() // I assume you already defined loadAll method in DAO
    }

    companion object {
        @Volatile
        private var INSTANCE: DatabaseManager? = null

        @JvmStatic
        fun getInstance(context: Context): DatabaseManager {
            return INSTANCE ?: synchronized(this) {
                INSTANCE ?: run {
                    val db = Room.databaseBuilder(
                        context,
                        AppDatabase::class.java, "database-name"
                    ).build()
                    DatabaseManager(db).also { INSTANCE = it }
                }
            }
        }
    }
}
  1. 在需要使用数据库的其他模块中,必须在 gradle 中实现 offlineservicelibrary 并在调用时将上下文传递给它
DatabaseManager.getInstance(context).loadData()

【讨论】:

  • 您好,感谢您提供此示例,我无法从我的项目中访问 getInstance 方法。我可以访问 DatabaseManager 但不能访问 getInstance 方法。 @聪海
  • 我也应该在presenter或Fragment中写DatabaseManager.getInstance(context).yourMethod()这个,因为presenter没有上下文权限
  • 我也从 Fragment 尝试过,但无法访问 getInstance 方法
  • 你提到了一个评论`声明你的函数......`请问里面有什么?
  • 啊哈这工作了` DatabaseManager.Companion.getInstance(getContext());`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2018-08-17
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多