2015-02-23 10 views
4

我正在构建一个Android应用,其中多个用户可以访问,修改和删除同一项目,并且我正在使用Firebase同步所有设备。 为了跟踪更新项目有一个时间戳。 我写了一个事务,以便当我尝试删除该项时,它会检查我的副本的时间戳是否比远程副本更早:在这种情况下,事务将中止并且该项不会被删除。如果以前在本地提交,Firebase事务不会中止远程

这里我的问题:

  1. 我的设备下线
  2. 我成功地删除项目
  3. 另一个用户修改远程数据库的项目
  4. 我的设备上线,并传播他的缺失

我以为它会远程中止,因为远程时间戳较新。 我真的不能看到中止功能的要点,如果我只能放弃基于本地数据的决定...

我应该如何处理这些类型的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),因为第二个似乎并没有工作。

+0

如果您的代码无法按照您希望的方式工作,请显示代码。我有一个想法你可以做什么来解决你的问题,所以会提供一个基于这个答案。但是,如果您要显示代码,则确定要容易得多,这也是我为什么还投票结束了您的问题的原因。 – 2015-02-24 00:29:03

回答

1

我解决我的问题是这样的:

  1. 我用mutableData.setValue(null),否则火力地堡不能使交易正常工作
  2. 我明确设置applyLocally布尔为真,因为我需要看本地活动

我不明白为什么mutableData.setValue(null)之前没有工作,我可能会错过以前的一些错误,但那是问题所在。

2

Firebase最初应用客户端事务,以提高并发性。如果该决定不符合您的使用情况,您可以将其他参数传递给transaction方法,以告知它绕过本地应用。

https://www.firebase.com/docs/web/api/firebase/transaction.html

applyLocally布尔可选

默认情况下,事件的每一个交易更新功能运行时提出的。所以如果它运行多次,你可能会看到中间状态。您可以将其设置为false以禁止这些中间状态,而是在引发事件之前等待事务完成。

相关问题