我正在尝试将 ds.getKey() 的值存储到全局变量 Common.workerType 所以无论什么时候我需要从数据库中获取一个值,我都不必一遍又一遍地重复这些代码,更理想的是只是为了让它像这样
final DatabaseReference dbRefChild = dbRef.child(Common.user_workers_table).child(Common.workerType).child(Common.uid);
我知道错误正在显示,因为它获得了null
数据,但是为什么会这样?我相信我得到了正确的节点路径。这是我得到的错误:
java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
final DatabaseReference newRef = FirebaseDatabase.getInstance().getReference();
final DatabaseReference newRefChild = newRef.child(Common.user_workers_table);
newRefChild.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds: dataSnapshot.getChildren()) {
if(ds.child(Common.uid).exists()) {
Common.workerType = ds.getKey();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
以下是数据库的外观:
Common.user_workers_table 指的是Workers
Common.workerType将指向管道工
答案 0 :(得分:1)
您不能将Common.workerType
声明为全局变量,只需在onDataChange()
方法之外使用它,因为它始终为null
。发生这种情况是因为此方法具有异步行为,这意味着甚至在从数据库获取数据之前就会调用它。
即使这是可能的,正如我在您的代码中看到的那样,您使用dataSnapshot
方法循环遍历整个getChildren()
对象,并且您获得的每个值都将它分配给同一个变量。在这种情况下,变量将始终具有最后一次迭代的值。
第一个问题的快速解决方案是,仅在Common.workerType
方法中使用onDataChange()
的值,或者如果您需要在外部使用,请深入了解异步世界并查看最后一部分我的回答来自 post 。您还可以查看此 video ,以便更好地理解。
答案 1 :(得分:0)
只需添加check null,如
当你生孩子的时候 if(Common.user_workers_table!=null)