java - Android : How to OnConflictStrategy. 替换但保留一个特定字段

标签 java android android-room android-architecture-components

我在 Android Room 中有一个 DAO,插入了 OnConflictStrategy.REPLACE,有一个 boolean 字段 downloaded,如果用户下载了这个对象,它就会变为 true,我想替换整个对象 onConflict,但在数据库中保留此字段的状态 (downloaded)。

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

    @Delete
    void delete(T message);

    @Update
    void update(T message);
}

最佳答案

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

为此使用OnConflictStrategy.FAIL。用 try/catch block 包围您的 insert(),然后在 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())

在 DAO 中,我按如下方式实现 update:

@Query("UPDATE name_of_your_table SET quantity = quantity + 1 WHERE id = :id")
fun updateModel(id: String)

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

关于java - Android : How to OnConflictStrategy. 替换但保留一个特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48517722/

相关文章:

java - 有没有办法从 xml 中定义的一个 TextView 制作一个 TextView 的 ArrayList ?

java - 安卓 Java : Trying to get this AES encryption library to work but it doesn't

Android:具有多个可点击按钮的 ListView 元素

android - 第二次选择选项卡时,onCreateView 没有调用操作栏 TabsAdapter 中的选项卡吗?

java - 如何在 Android 上为 Room 库设置 proguard 规则

java - Hadoop 如何拆分和组合其输出数据?

java - 如何使用 MarkLogic Java API 调用路径范围索引查询?

android - 布局元素 : one on top of the other

java - 房间 - LiveData 未触发

android - 使用改造从服务器获取数据后如何将数据存储在房间数据库中