我有一个 Room 数据库项目,其中数据库中的每个表都有一个 DAO 和一个存储库(不同数据源之间的中介)。有很多文件和类名需要记住。
我想知道每个项目使用单个存储库和 DAO 类是否有缺点?
没有这样的规则,你必须为每张桌子单独制作
@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
表的数据库调用,我会拆分存储库,每个表一个,有两个存储库。
总而言之,这些只是约定,上面只是建议的编码风格。
我在 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
}
}
}
}
因此,是的,您可以在单个数据库中创建和使用多个表,只需记住创建单独的实体类