【问题标题】:Is it possible to have multiple files dao to the same database on android?android上的同一个数据库是否可以有多个文件dao?
【发布时间】:2021-08-23 15:02:40
【问题描述】:

我想创建多个 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()
        )
    }
} 

【问题讨论】:

  • .dao1().dao2().dao3().... 你到底想在这里完成什么?
  • 这只是一个尝试,我的目标是拥有一个我的数据库实例,我可以在其中拥有多个@Daos 接口,这样就不会拥有一个包含超过 1000 行的大文件和多个查询和在多个表中插入我每个表都有一个文件。
  • 如果你使用 Koin,所有这些都进入 Koin 模块。如果您不太了解 Koin,请不要使用 Koin(或者学习如何使用它,我猜,无论您喜欢哪种解决方案)。

标签: android kotlin android-room koin


【解决方案1】:

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

根据您的代码,我假设您已经有一个 ContaBancariaDao 类。如果你想创建更多的 DAO,你需要创建类似的新类。

那么你只需要在你的CArchDatabase中添加一个新的fun

如果您还想添加新实体,请记住将它们添加到 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()
        }
    }

}

【讨论】:

  • 我在我的第一个代码示例中尝试这样做。但是我收到一个错误“没有找到类的定义:'br.com.data.local.database.daos.ContaBancariaDao'。检查你的定义!”
  • 这是 Koin 实现的问题。您要求的课程 (ContaBancariaDao) 您没有定义如何获得。不过,您确实定义了如何创建CArchDatabase 的实例。简单的解决方案是更改ContaBancariaCacheDataSourceImpl 构造函数中的依赖关系以接收CArchDatabase。这样你就可以使用contaBancariaDao() 来获取DAO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多