modified) as a parameter. If its primary key

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

我如何在Room数据库中进行这个查询?

@Query("INSERT OR IGNORE INTO ChapterInfo (chapterId, readDate) VALUES (:chapterId, :readDate) UPDATE ChapterInfo SET readDate = :readDate WHERE chapterId = :chapterId")
void insertReadChapterDate(long chapterId, Date readDate);

当我试着做的时候,我得到了错误。"有一个问题与查询。[SQLITE_ERROR] SQL错误或数据库丢失(靠近 "UPDATE":语法错误)" ?

你有什么想法,我可以插入值到表中,但如果记录与此ID存在 - 更新它?

android-sqlite android-room
1个回答
0
投票

也许通常的插入房间的方式可以做到?

在你的Dao中。

@Insert(onConflict = OnConflictStrategy.REPLACE) void insert(ChapterInfo chapterInfo)

调用你的DAO方法 你的put对象(new052020)

很明显,这个问题是关于:如何在DB中设置一些值,包括场景。

@Query("INSERT OR REPLACE INTO ChapterInfo ('chapterId', 'readDate') VALUES (:chapterId, :readDate)
void insertReadChapterDate(long chapterId, Date readDate);

在DB中没有主键的记录,那么函数应该添加新的记录,设置给定的值,而行中的其他列应该不初始化。那么函数应该添加新的记录,设置给定的值,其余的列应该不初始化。

. 有一行有这样的主键,那么函数应该只更新给定的值,其余的列--保持不变。

  1. .作为一个决定,你可以在一个事务中实现两个SQL命令 "INSERT OR IGNORE "和 "UPDATE"。
  2. 所以从外部看,你应该只使用 "insertUpdateChapterDate "方法。

@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);
}

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