【问题标题】:Concurrent transactions in firebase resulting null while reading the dataSnapshot读取dataSnapshot时firebase中的并发事务导致null
【发布时间】:2017-07-05 15:04:54
【问题描述】:

两个应用使用相同的 firebase 数据库。一个应用,即 A 正在使用 setValue 写入一些值。第二个应用,即 B 正在尝试使用 addListenerForSingleValueEvent 读取一些数据,这些数据与 A 相关,例如 A 用户个人资料信息同时。这导致读取数据库时 B 应用程序中的数据快照为空值。谁能指导我如何避免这种情况。

为了澄清一下,A 正在写入与 B 正在访问的节点不同的其他节点。

这就是我从 B 应用程序访问数据的方式。

DatabaseReference usersRef = MyDatabaseUtils.getUsersReference();
    usersRef.orderByChild("userId").equalTo(userIdValue).addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Get value
            if (dataSnapshot.getChildrenCount() > 0) {
                 // Do something
            } else {
                // Show error
            }
        }

        @Override
        public void onCancelled(final DatabaseError databaseError) {
           // Show error
        }
    });

如果我在 B 应用程序中阅读时停止 A 写入,一切正常。

【问题讨论】:

  • 您能否在应用 B 中包含使用 addListenerForSingleValueEvent 的函数或类的代码 sn-p?
  • @PatNeedham,我已经更新了帖子。
  • 你能解释一下应用 A 中发生的确切时刻/动作,它导致来自 BValueEventListener 触发其 onDataChange功能?并且包含来自 A 的相关代码 sn-p 也可能会有所帮助。
  • 如果您收到 NullPointerException,还有一个堆栈跟踪准确地指向引发异常的行。请找到堆栈跟踪,在您的问题中分享,并指出引发异常的行。
  • 我没有 NullPointerException。 dataSnapshot 结果为空。

标签: android firebase firebase-realtime-database


【解决方案1】:

一个简单的解决方法是防止 datasnapshotonDataChange 函数中为空:

if (dataSnapshot != null && dataSnapshot.getChildrenCount() > 0) 

A 写入 Firebase 时,可能会从 usersRef 中删除以前存在的一些属性。

【讨论】:

  • 问题不是要保护应用程序的空数据,问题是为什么它要返回空数据。
  • 从应用 A,您在 users/ 节点下向 Firebase 发送了哪些具体的写入?可能您使用的是setValue(),它会删除指定位置的数据,而不是updateChildren(),后者可能更合适。
  • A 正在写入来自 B 正在访问的节点的其他节点。
猜你喜欢
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2014-08-18
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
相关资源
最近更新 更多