我有一个包含字段1-名称,2-价格,
一个Firebase函数获取项目列表(包含两个字段)
然后我有一个按钮,将数据添加到firebase。添加名字然后添加价格
public void addItemForStore(String itemName, String itemPrice) {
DatabaseReference ref = database.getReference().child("items").push();
ref.child("name").setValue(itemName);
ref.child("price").setValue(itemPrice);
}
但是问题是当添加名称时
public void getStoreItemData(final StoreItemCallBack callBack) {
DatabaseReference ref = database.getReference().child("items");
final ArrayList<StoreItemModel> list = new ArrayList<>();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
list.clear();
for(DataSnapshot item : dataSnapshot.getChildren()){
String key = item.getKey();
list.add(new StoreItemModel(key, item.child("name").getValue().toString(),
item.child("price").getValue().toString()));
}
callBack.onSuccess(list);
}else{
callBack.onSuccess(null);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
callBack.onFailure(databaseError.toException());
}
});
}
上面函数的onDataChange被触发,它获取price的值为null并使应用程序崩溃。
下次我重新启动该应用程序时,它会正确显示,因为现在已添加了数据。
更新
显示的错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
数据库-
最佳答案
现在,您通过两个单独的调用将这两个值设置到数据库中:
DatabaseReference ref = database.getReference().child("items").push();
ref.child("name").setValue(itemName);
ref.child("price").setValue(itemPrice);
这导致您的
onDataChange
被调用两次。您可以通过检查null来解决onDataChange
中的问题。但是更好的方法可能是在一个调用中添加名称和价格:
DatabaseReference ref = database.getReference().child("items").push();
Map<String, Object> values = new HashMap<>();
values.put("name", itemName);
values.put("price", itemPrice);
ref.setValue(values);
现在只有一个写入操作,因此您的
onDataChange
获得了它期望的两个值。关于java - 在Firebase中等待onDataChange,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59055138/