【问题标题】:How to Handle Offline Transactions in Firebase Realtime Database?如何在 Firebase 实时数据库中处理离线事务?
【发布时间】:2017-01-12 18:11:50
【问题描述】:

我有一个addValueEventListener,它监听 Firebase 实时数据库中的任何值变化。在在线模式下,一切正常。

但在离线模式下,设备处于离线状态,并且我的 Web 服务器已在 Firebase 实时数据库上以相同的值完成了多个事务,我从 Android 中为其设置了监听器。设备上线后,只会监听最后一笔交易,跳过中间的其他交易。

PFB 参考 link。到目前为止我所做的 PFB 代码:

     FirebaseDatabase.getInstance().setPersistenceEnabled(false);
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference myRef = firebaseDatabase.getReference("mykey");
        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                    HashMap<String, Object> key_Value = (HashMap<String, Object>) dataSnapshot.getValue();
                    for (String key : key_Value.keySet()) {
                        System.out.println("firebase key is "+key);
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w("feroz ", "Failed to read value.", error.toException());
            }
        });
    }

【问题讨论】:

  • Firebase 不存储交易。连接数据库时,您将获得最后一个值。因此,您必须将每笔交易存储在另一个节点中。
  • 感谢您的回复,但我如何附加存储在节点中的数据。在每次推送的情况下,它将生成新的消息 ID。我需要一个不断追加的数组列表
  • 你能把你的数据库 json 添加到问题(它的相对部分)吗?
  • 推送 ID 可以很好地存储数据列表。它们按时间戳排序。请参阅此处“附加到数据列表”标题下的文档。 firebase.google.com/docs/database/android/save-data

标签: android firebase firebase-realtime-database


【解决方案1】:

Firebase 实时数据库存储从查询中返回的信息,以便在断开连接时使用。对于断开连接时提出的问题,Firebase 实时数据库会继续处理已经堆积的信息。如果请求的信息没有堆积,Firebase 实时数据库会从附近的保护区加载信息。当我们在线返回时,我们的信息将堆叠并反映查询。

例如,我们的应用程序中有一段代码询问 Firebase 实时分数数据库中的最后四件事

DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
scoresRef.orderByValue().limitToLast(4).addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChild) {
      System.out.println("The " + snapshot.getKey() + " dinosaur's score is " + snapshot.getValue());
    }
});

【讨论】:

  • 在实时应用程序中,区分客户何时关联和分离通常很有价值。例如,当客户分离时,我们可能需要检查客户是否“断开连接”。 DatabaseRef presenceRef = FirebaseDatabase.getInstance().getReference("disconnectmessage"); // 当这个客户端失去连接时写一个字符串 PresenceRef.onDisconnect().setValue("I disconnected!");
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2021-11-23
  • 2019-03-23
  • 2016-10-21
  • 2019-05-13
相关资源
最近更新 更多