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)
答案有点晚了,但我只是在我的代码中做了同样的事情。您的方法不应该替换对象,而是使用需要更新的字段更新现有对象,并保留下载的对象。
对于这个用途OnConflictStrategy.FAIL。insert()用块包围你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设置需要更新的所有字段。
| 归档时间: |
|
| 查看次数: |
4058 次 |
| 最近记录: |