Android的Room持久性库慷慨地包含了适用于对象或集合的@Insert和@Update注释。然而,我有一个用例(包含模型的推送通知),需要一个UPSERT,因为数据可能存在于数据库中,也可能不存在。
Sqlite没有本地支持upsert的功能,解决方法在这个SO问题中有描述。鉴于那里的解决方案,如何将它们应用到Room中?
更具体地说,如何在Room中实现插入或更新操作,而不会破坏任何外键约束?使用onConflict=REPLACE的insert将调用该行任何外键的onDelete。在我的情况下,onDelete会引起级联,并重新插入一行将导致删除其他表中具有外键的行,这不是预期的行为。
UPSERT
等价物。例如,如果您在表中有一个unique
键,并且您正在插入一些行,其中包括0个主键和现有唯一键以及OnConflictStrategy.IGNORE
策略,则该行将不会被插入,因为唯一键重复,这是预期的。问题是0主键是insert
的有效值,但是对于update
而言则是错误的值,该行将不会被更新。在原始的SQLite中,您可以使用ON CONFLICT(word) DO UPDATE
来处理这种情况。 - James Bond