我正在构建一个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),因为第二个似乎不起作用.
解决方法:
Firebase最初应用客户端事务,以提高并发性.如果该决定不符合您的用例,您可以将另一个参数传递给事务方法,该方法告诉它绕过本地apply.
见https://www.firebase.com/docs/web/api/firebase/transaction.html
总结applyLocally Boolean Optional
By default, events are raised each time the transaction update function runs. So if it is run multiple times, you may see intermediate states. You can set this to false to suppress these intermediate states and instead wait until the transaction has completed before events are raised.
以上是内存溢出为你收集整理的android – 如果以前在本地提交,Firebase事务不会远程中止全部内容,希望文章能够帮你解决android – 如果以前在本地提交,Firebase事务不会远程中止所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)