4

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

这是我的问题:

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

我认为它会远程中止,因为远程时间戳更新。如果我只能根据本地数据中止决定,我真的看不到中止功能的意义......

我应该如何在 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)因为第二个似乎不起作用。

4

2 回答 2

2

Firebase 最初在客户端应用事务,以提高并发性。如果该决定不符合您的用例,您可以向该transaction方法传递一个附加参数,告诉它绕过本地应用。

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

applyLocally Boolean 可选

默认情况下,每次事务更新函数运行时都会引发事件。因此,如果它运行多次,您可能会看到中间状态。您可以将其设置为 false 以抑制这些中间状态,而是等到事务完成后再引发事件。

于 2015-02-24T00:32:57.867 回答
1

我以这种方式解决了我的问题:

  1. 我用过mutableData.setValue(null),否则 Firebase 无法使事务正常工作
  2. 我将applyLocally布尔值显式设置为 true,因为我也需要查看本地事件

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

于 2015-02-25T10:41:29.527 回答