Android Room 数据库项目中单个或多个 DAO 和 Repository?

问题描述 投票:0回答:2

我有一个 Room 数据库项目,其中数据库中的每个表都有一个 DAO 和一个存储库(不同数据源之间的中介)。有很多文件和类名需要记住。

我想知道每个项目使用单个存储库和 DAO 类是否有缺点?

android android-room
2个回答
32
投票

没有这样的规则,你必须为每张桌子单独制作

@Dao
。您可以创建一个 Dao 类来保存所有数据库查询。

@Dao
interface MyDao{
    @Query("SELECT * FROM Student")
    fun getStudents(): List<User>

    @Query("SELECT * FROM Professors")
    fun getProfs(): List<User>
}

但是按照惯例,你可以为每个实体创建单独的 Dao。这样你的代码就会被组织起来,仅此而已。如果同一个 Dao 中有一堆不相关的查询,那么检查代码会很困难。

对于存储库,我会采用不同的方法。尽管没有规定必须使用单独的存储库或单个存储库,但只要我认为有必要,我就会同时使用这两种存储库。

例如,如果我只有一个来自

User
表的数据库调用和一个来自
Post
表的数据库调用,我不认为为每个表拥有两个单独的存储库有什么意义。所以在这种情况下我只会创建一个存储库。但另一方面,如果我有 10 个来自
User
表的数据库调用,还有 10 个来自
Post
表的数据库调用,我会拆分存储库,每个表一个,有两个存储库。

总而言之,这些只是约定,上面只是建议的编码风格。


0
投票

我在 Kotlin 中就是这样做的

首先通过清除/删除 avd 或物理设备中的应用程序数据来重置数据库,具体取决于您安装应用程序的位置

或者,您可以创建一个新的房间数据库

创建您的实体类

第一个实体类

@Entity(tableName = "news_table_name")
data class ArticleObject(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "row_id")
    var rowId: Int,
    @ColumnInfo(name = "article_id")
    var articleId: String
   )

   

第二个实体类

@Entity(tableName = "users_table")
data class UserObject (
   @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "rowId")
    val rowId:Int,
    @ColumnInfo(name = "author_user_id")
    val authorUserId:Int,
    @ColumnInfo(name = "author_user_name")
    val authorUserName:String,
   )

Dao 接口

@Dao
interface NewsDao {

    @Insert
    suspend fun insertUser(userObject: UserObject)

    @Insert
    suspend fun insertNews(articleObject: ArticleObject)
    }

房间数据库

@Database(entities = [ArticleObject::class, UserObject::class], version = 1, exportSchema = false)
abstract class NewsDatabase : RoomDatabase() {

    abstract fun newsDao(): NewsDao

    companion object {
        @Volatile
        private var INSTANCE: NewsDatabase? = null
        fun getInstance(context: Context): NewsDatabase? {
            synchronized(this) {
                var instance = INSTANCE
                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        NewsDatabase::class.java,
                        "news_database"
                    ).build()
                }
                return instance
            }
        }
    }
}

因此,是的,您可以在单个数据库中创建和使用多个表,只需记住创建单独的实体类

© www.soinside.com 2019 - 2024. All rights reserved.