也许通常的插入房间的方法可以吗?
在你的道中:
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ChapterInfo chapterInfo)
调用你的 DAO 方法你的 put 对象(新的|修改的)作为参数。如果它的主键|键已经在 DB 中,Room 在表中创建行并替换行的字段。否则 Room 会添加新行。
更新
您的初始变体也可以修复(如果 chapterId - 是主键):
@Query("INSERT OR REPLACE INTO ChapterInfo ('chapterId', 'readDate') VALUES (:chapterId, :readDate)
void insertReadChapterDate(long chapterId, Date readDate);
更新(2020 年 13 月 5 日)
很明显,问题是关于:
如何在数据库中设置一些值,包括场景:
-
没有具有此类主键的行。然后函数应该添加新行,设置给定值,并且该行中的其余列不应该初始化。
-
有这样的主键的行。然后函数应该只更新给定的值和其余的列 - 保持不变。
作为决定,您可以在一个事务中实现两个 SQL 命令“INSERT OR IGNORE”和“UPDATE”:
@Query("INSERT OR IGNORE INTO ChapterInfo (chapterId, readDate) VALUES (:chapterId, :readDate)
void insertOrIgnoreChapterDate(long chapterId, Date readDate);
@Query("UPDATE ChapterInfo SET readDate = :readDate WHERE chapterId = :chapterId)"
void updateChapterDate(long chapterId, Date readDate);
@Transaction
void insertUpdateChapterDate(long chapterId, Date readDate){
insertOrIgnoreChapterDate(long chapterId, Date readDate);
updateChapterDate(long chapterId, Date readDate);
}
所以从外部你应该只使用“insertUpdateChapterDate”方法