是否有一种方法或方法可以从模块/库中提供一个Room DB实例,可以在任何项目(app模块)上使用?
我面临的问题是扩展RoomDatabase()的抽象类位于我们的应用程序模块中,在那里我们使用@Database注释来定义实体。这就是我不能提供来自应用程序模块以外的模块的Room实例的原因,因为创建Room实例需要定义扩展RoomDataBase()的应用程序数据库类。
示例在我的:app:libs:common模块中。这是一个子模块,它有自己的存储库,可以用于任何项目。appName是在驻留在app模块本身的AppModule中提供的,它正在使用我制作的SharedPreferences。
@Module
CommonModule {
@Provides
@Singleton
fun provideSharedPreferencesInstance(
@Named("AppName") appName: String,
application: Application
): SharedPreferences {
application.apply {
return getSharedPreferences(appName, MODE_PRIVATE)
}
}
@Provides
@Singleton
fun provideAppSharedPrefImplInstance(
sharedPreferences: SharedPreferences
): SharedPref = SharedPrefImpl(sharedPreferences)
@Provides
@Singleton
fun provideRoomDatabaseInstance(
application: Application,
@Named("AppName") appName: String,
@Named("AppDatabase") roomDatabase: RoomDatabase
): RoomDatabase {
return Room
.databaseBuilder(application, roomDatabase.javaClass, appName)
.fallbackToDestructiveMigration()
.build()
}
}这是应用模块。
@Module
object AppModule {
@Provides
@Singleton
@Named("AppName")
fun provideAppName(application: Application): String {
application.apply {
return getString(R.string.app_name)
}
}
@Provides
@Singleton
fun provideAssetDao(@Named("AppDatabase") db: AppDatabase): AssetDao {
return db.assetDao
}
}由于我们在扩展RoomDatabase()时使用抽象类(在本例中是AppDatabase ),所以我尝试使用@Binds,希望它能够工作。
@Module
abstract class RoomModule {
@Binds
@Singleton
@Named("AppDatabase")
abstract fun bindAppDatabase(appDatabase: AppDatabase): AppDatabase
}我认为能够通过公共模块上的泛型提供AppDatabase类将允许我解决这个问题。
发布于 2022-04-06 03:28:19
我遇到过这个案子。我已经编写了一个样板,用于在Android项目中使用多个模块,它包含了房间数据库。您可以参考我的repos 我的回购
希望这对你有帮助
https://stackoverflow.com/questions/71758127
复制相似问题