我创建了一个Android库,其中有一个Room数据库,由于Room数据库应该只有一个实例,我有 OfflineDatabaseManager
getInstance
方法,该方法将实例提供给 Android project
通过传递上下文来访问它。我在Android项目中拥有上下文,我可以传递它。
我想监听库内数据库表的变化,这样我就可以对它做一些事情,我已经写了一个类。OfflineDataChangeListener
但要获得数据库的实例,我需要传递上下文,请问如何在库中进行。
库 - OfflineDatabaseManager
class OfflineDatabaseManager private constructor(private val dp: LibraryDatabase) {
fun getOfflineData() : Flow<List<OfflineData>> {
return dp.getOfflineDataDao().getOfflineData()
}
suspend fun insertOfflineData(offlineData: OfflineData) {
dp.getOfflineDataDao().insertOfflineData(offlineData)
}
companion object {
@Volatile
private var INSTANCE: OfflineDatabaseManager? = null
fun getInstance(context: Context): OfflineDatabaseManager {
return INSTANCE ?: synchronized(this) {
INSTANCE ?: run {
val db = Room.databaseBuilder(
context,
LibraryDatabase::class.java, "database-name"
).build()
OfflineDatabaseManager(db).also { INSTANCE = it }
}
}
}
}
}
库 - OfflineDataChangeListener - 我如何通过上下文来获取DB的信息?
class OfflineDataChangeListener: CoroutineScope {
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun observeOfflineDataChanges() {
launch {
OfflineDatabaseManager.getInstance(HOW TO GET CONTEXT HERE).getOfflineData().collect {
Log.d("dbChangeListener", "I am listening to databas echanges")
}
}
}
}
安卓项目-
在我的android项目中,我是这样访问和监听变化的。
fun getOfflineData() {
launch {
OfflineDatabaseManager.getInstance(app.applicationContext).getOfflineData().collect {
Timber.d( "observing offline data" + it.toString())
}
}
}
我想做同样的事情,但在库内。
谢谢
你可以提供一些函数给客户端,它传递的是 Context
到您的库中。在您的库中创建一个 object
类。
object Library {
lateinit var context: Context
fun init(ctx: Context) {
context = ctx.applicationContext
}
}
客户必须打电话给你 init()
函数,例如,在他们应用程序的 onCreate()
方法。
Library.init(this)
在图书馆里,你可以像这样访问它。
OfflineDatabaseManager.getInstance(Library.context)