首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有匕首2的Android机房多模块

带有匕首2的Android机房多模块
EN

Stack Overflow用户
提问于 2022-04-05 20:39:40
回答 1查看 631关注 0票数 1

是否有一种方法或方法可以从模块/库中提供一个Room DB实例,可以在任何项目(app模块)上使用?

我面临的问题是扩展RoomDatabase()的抽象类位于我们的应用程序模块中,在那里我们使用@Database注释来定义实体。这就是我不能提供来自应用程序模块以外的模块的Room实例的原因,因为创建Room实例需要定义扩展RoomDataBase()的应用程序数据库类。

示例在我的:app:libs:common模块中。这是一个子模块,它有自己的存储库,可以用于任何项目。appName是在驻留在app模块本身的AppModule中提供的,它正在使用我制作的SharedPreferences。

代码语言:javascript
运行
复制
 @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()
        }
    
}

这是应用模块。

代码语言:javascript
运行
复制
@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,希望它能够工作。

代码语言:javascript
运行
复制
@Module
abstract class RoomModule {

    @Binds
    @Singleton
    @Named("AppDatabase")
    abstract fun bindAppDatabase(appDatabase: AppDatabase): AppDatabase

}

我认为能够通过公共模块上的泛型提供AppDatabase类将允许我解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2022-04-06 03:28:19

我遇到过这个案子。我已经编写了一个样板,用于在Android项目中使用多个模块,它包含了房间数据库。您可以参考我的repos 我的回购

希望这对你有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71758127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档