代码之家  ›  专栏  ›  技术社区  ›  BRDroid

Android库模块中的房间数据库设置

  •  0
  • BRDroid  · 技术社区  · 5 年前

    我有一个现有的Android项目,我在其中创建了一个新的 Android Library (离线服务库)(文件/新/新模块/Android库)。在这个库中,我想创建一个房间数据库。

    我跟着 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类的类。我是否应该创建一个扩展Application类的新类,并在那里执行上述步骤。

    请建议我应该做些什么来设置图书馆的房间数据库

    这是我的图书馆项目结构

    enter image description here

    0 回复  |  直到 5 年前
        1
  •  1
  •   Công Hải    5 年前
    1. Make DatabaseManager 模块内的Singleton类。使用 @JvmStatic 帮助您从Java调用 Companion
    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. 在其他需要使用数据库的模块中,必须实现 offlineservicelibrary 在里面 gradle 并在调用时将上下文传递给它
    DatabaseManager.getInstance(context).loadData()