Android:如何 OnConflictStrategy.REPLACE 但保留一个特定字段

Rel*_*elm 10 java android android-room android-architecture-components

我在 Android Room 中有一个 DAO,插入时使用 OnConflictStrategy.REPLACE,有一个布尔字段downloaded,如果用户下载了该对象,该字段将更改为 true,我想在冲突时替换整个对象,但保留该字段的状态( downloaded) 在数据库中。

public interface DAOTemplate<T> {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    @NonNull
    void insert(T... messages);

    @Delete
    void delete(T message);

    @Update
    void update(T message);
}
Run Code Online (Sandbox Code Playgroud)

Rai*_*ker 4

答案有点晚了,但我只是在我的代码中做了同样的事情。您的方法不应该替换对象,而是使用需要更新的字段更新现有对象,并保留下载的对象。

对于这个用途OnConflictStrategy.FAILinsert()用块包围你try/catch,然后在 catch 中放置你的update()电话。我使用 RXJava + Kotlin 来实现,但您可以使用任何其他异步方法来实现此逻辑。

fun saveItem(item: Item): Single<Unit>? =
            Single.fromCallable {
                try {
                    dao.save(item)
                } catch (exception: SQLiteConstraintException) {
                    dao.updateModel(item.id)
                } catch (throwable: Throwable) {
                    dao.updateModel(item.id)
                }
            }.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
Run Code Online (Sandbox Code Playgroud)

在 DAO 中我的实现update如下:

@Query("UPDATE name_of_your_table SET quantity = quantity + 1 WHERE id = :id")
fun updateModel(id: String)
Run Code Online (Sandbox Code Playgroud)

在这里,我增加了数量,但您可以将要更新的字段作为参数传递,并用于SET设置需要更新的所有字段。