我正在构建一个 Android 应用程序,其中多个用户可以访问、修改和删除同一个项目,并且我正在使用 Firebase 同步所有设备。为了跟踪更新,该项目具有时间戳。我编写了一个事务,以便当我尝试删除该项目时,它会检查我的副本的时间戳是否早于远程副本:在这种情况下,事务中止并且该项目不会被删除。
这是我的问题:
- 我的设备离线
- 我成功删除了该项目
- 另一个用户修改远程数据库上的项目
- 我的设备上线并传播他的删除
我认为它会远程中止,因为远程时间戳更新。如果我只能根据本地数据中止决定,我真的看不到中止功能的意义......
我应该如何在 Firebase 中处理这些类型的冲突?
- 更新
这是我用来删除项目的代码。如果另一个用户在本地删除后远程更改了项目,它应该中止。
private void removeItem(final ListItem item, final Firebase itemRef) {
itemRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
if(mutableData == null) return Transaction.abort();
else if((long)mutableData.child("lastUpdate").getValue() > item.getLastUpdate()) return Transaction.abort();
else{
itemRef.removeValue();
return Transaction.success(mutableData);
}
}
});
请注意,我使用itemRef.removeValue()
而不是mutableData.setValue(null)
因为第二个似乎不起作用。