【问题标题】:Firebase database always returns nullFirebase 数据库始终返回 null
【发布时间】:2018-04-23 16:17:40
【问题描述】:

从这个 firebase 数据库读取时,它总是返回 null 而不是我需要的值。

我尝试以 String.class 的形式将其拉出,但它仍然为空。

我需要从数据库中提取的只是 int dose,在这种情况下,pName 变量将是 dfdf

final FirebaseDatabase aDatabase = FirebaseDatabase.getInstance();
final DatabaseReference mDatabase = aDatabase.getReference();
DatabaseReference myRef =  aDatabase.getReference(pName).child("dose");

// Read from the database
myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       // This method is called once with the initial value and again
       // whenever data at this location is updated.
       Integer Value = dataSnapshot.getValue(Integer.class);
       String peter = Integer.toString(Value);
       count.setText(peter);
    }

    @Override
    public void onCancelled(DatabaseError error) {
        count.setText("E");
    }
});

【问题讨论】:

  • 1) 尝试改用addListenerForSingleValueEvent 2) 记录dataSnapshot 的值或在调试器中设置断点。
  • 将此final FirebaseDatabase aDatabase = FirebaseDatabase.getInstance(); 替换为final DatabaseReference aDatabase = FirebaseDatabase.getInstance();
  • 添加单值事件仍然返回 null 我还在活动上使用按钮侦听器更改此值,所以我真的不想使用此方法(尽管我确实尝试过)。
  • firebaseDatabases 和 DatabaseReference 是您告诉我实例化数据库引用和 firebaseDatabase 的两种不同类型,相当于 String w1 = (Object) w2;不起作用,但参考可以是 firebaseDatabase.reference();
  • 很荣幸我的名字在这里作为变量:D

标签: java android firebase firebase-realtime-database


【解决方案1】:

尝试改变 -

DatabaseReference myRef =  aDatabase.getReference(pName).child("dose");

到 -

DatabaseReference myRef =  mDatabase.child(pName).child("dose");

你应该在 mDatabase 而不是 aDatabase 上运行,并且让孩子不参考

并将监听器更改为

addListenerForSingleValueEvent

【讨论】:

  • mDatabase 是另一个 DatabaseReference,它不太具体地用于代码的其他部分,我增加剂量 aDatabase 是 firebase 数据库引用,更改这将破坏代码
  • 好的,所以要让它工作,具体来说,制作它的另一个实例
  • 好先生,我非常感谢你赢得了所有的饼干这是正确的答案!万岁
  • 快乐编码:)
【解决方案2】:
DatabaseReference myRef = mDatabase.child(pName).child("dose");

如上所述修复引用。

【讨论】:

  • mDatabase 是另一个 DatabaseReference,它不太具体地用于代码的其他部分,我增加剂量 aDatabase 是 firebase 数据库引用,更改这将破坏代码更多
  • 您可能会获得另一个变量来获取您的 firebase 数据库中节点的引用。但是,我们的想法是在您的参考中使用child()
【解决方案3】:

试试这个代码..

    private void readData(){
    final FirebaseDatabase aDatabase = FirebaseDatabase.getInstance();
    final DatabaseReference mDatabase = aDatabase.getReference();

   // Read from the database child() method put your database name
    mDatabase.child("dfdf").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
           // if i insert data as user class object then it give user.class
           // User user = dataSnapshot.getValue(User.class);

            Integer Value = dataSnapshot.getValue(Integer.class);
            String peter = Integer.toString(Value);
            count.setText(peter);
        }

        @Override
        public void onCancelled(DatabaseError error) {
            count.setText("E");
        }
    });
}

【讨论】:

  • 仍然返回 null
  • Integer.class给出的所有值
  • 无论你的 pojo 类插入了什么数据,它只给那些类作为读取数据时间
  • 假设所有值定义到 User.class 中它返回 User.class
  • 我认为还要检查 firebase 数据库规则。如果你愿意,你可以参考这个链接simplifiedcoding.net/firebase-realtime-database-crud
【解决方案4】:

尝试以下方法:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("dfdf");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(dataSnapshot.exists()){
  int value = dataSnapshot.child("dose").getValue(Integer.class);
    Log.i("Value is:", value);
  }
}

@Override
public void onCancelled(DatabaseError error) {
    count.setText("E");
  }
});

上面会检查快照dfdf是否存在然后进入onDataChange并检索子dose

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2019-03-26
    • 2019-02-27
    • 2019-04-12
    • 2021-08-15
    • 2020-08-20
    • 1970-01-01
    • 2016-05-31
    • 2015-08-15
    相关资源
    最近更新 更多