我正在构建一个Android应用,其中多个用户可以访问,修改和删除同一项目,并且我正在使用Firebase同步所有设备。 为了跟踪更新项目有一个时间戳。 我写了一个事务,以便当我尝试删除该项时,它会检查我的副本的时间戳是否比远程副本更早:在这种情况下,事务将中止并且该项不会被删除。如果以前在本地提交,Firebase事务不会中止远程
这里我的问题:
- 我的设备下线
- 我成功地删除项目
- 另一个用户修改远程数据库的项目
- 我的设备上线,并传播他的缺失
我以为它会远程中止,因为远程时间戳较新。 我真的不能看到中止功能的要点,如果我只能放弃基于本地数据的决定...
我应该如何处理这些类型的Firebase冲突?
- UPDATE
这是我用来删除项目的代码。如果其他用户在本地发生删除后远程更改了项目,它应该中止。
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)
,因为第二个似乎并没有工作。
如果您的代码无法按照您希望的方式工作,请显示代码。我有一个想法你可以做什么来解决你的问题,所以会提供一个基于这个答案。但是,如果您要显示代码,则确定要容易得多,这也是我为什么还投票结束了您的问题的原因。 – 2015-02-24 00:29:03