首页 > 解决方案 > android上的同一个数据库是否可以有多个文件dao?

问题描述

我想创建多个 DAOS 文件以更好地组织项目,即使我只有一个数据库。当我尝试按照这些方式做某事时,它会起作用:

@Database(version = 1, entities = [ContaBancaria::class])
abstract class CArchDatabase : RoomDatabase() {

    abstract fun contaBancariaDao(): ContaBancariaDao

    companion object {
        fun createDatabase(context: Context): RoomDatabase {
            return Room.databaseBuilder(context, CArchDatabase::class.java, "CArchDatabase.db")
                .fallbackToDestructiveMigration()
                .build()
        }
    }
}

但是,当我尝试这样的事情时,它不起作用:

@Database(version = 1, entities = [ContaBancaria::class, entity1, entity2,entity3 ....])
abstract class CArchDatabase : RoomDatabase() {
    abstract fun contaBancariaDao(): ContaBancariaDao
    abstract fun dao1(): dao1
    abstract fun dao2(): dao2
    abstract fun dao3(): dao3
    abstract fun dao4(): dao4
    .
    .
    .

    companion object {
        fun createDatabase(context: Context): RoomDatabase {
            return Room.databaseBuilder(context, CArchDatabase::class.java, "CArchDatabase.db")
                .fallbackToDestructiveMigration()
                .build().dao1().dao2().dao3()....
        }
    }
}

我正在使用 koin 单例来创建我的数据库

val cacheDataModule = module {
    single { CArchDatabase.createDatabase(androidContext()) }
    factory<ContaBancariaCacheDataSource> {
        ContaBancariaCacheDataSourceImpl(
            contaBancariaDao = get()
        )
    }
} 

标签: androidkotlinandroid-roomkoin

解决方案


每个数据库 DAO 都必须有一个@Dao定义操作的类(查看文档:https ://developer.android.com/training/data-storage/room#dao )

从您的代码中,我假设您已经有一个ContaBancariaDao课程。如果要创建更多 DAO,则需要创建与该类类似的新类。

然后你只需要fun在你的CArchDatabase.

如果您还想添加新实体,请记住在注释中将它们添加到entities数组中。@Database

@Database(entities = arrayOf(ContaBancaria::class, Other::class), version = 1)
abstract class CArchDatabase : RoomDatabase() {
    abstract fun contaBancariaDao(): ContaBancariaDao
    abstract fun otherDao(): OtherDao

    companion object {
        fun createDatabase(context: Context): RoomDatabase {
            return Room.databaseBuilder(context, CArchDatabase::class.java, "CArchDatabase.db")
                .fallbackToDestructiveMigration()
                .build()
        }
    }

}

推荐阅读