我想把所有的firebase节点都放在"服装"我的firebase数据库中的引用。为此,我将ChildEventListener
附加到引用,并在onChildAdded
回调中将Clothing
对象添加到服装对象列表中,假设onChildAdded
回调被称为"服装"下有节点的次数。参考
mClothingRef = FirebaseDatabase.getInstance()
.getReference()
.child("clothing");
final List<Clothing> clothingItems = new ArrayList<>();
mClothingRef.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot snapshot, String s) {
Clothing clothing = snapshot.getValue(Clothing.class);
clothingItems.add(clothing);
Log.d(TAG, "onChildAdded called");
}
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, databaseError.getMessage() + " " +
databaseError.getCode() + " " + databaseError.getDetails() + " " + databaseError.toString());
mEventBus.post(new ListClothingFailEvent());
}
...
}
这是数据库结构:
-->root
---->clothing
------>clothing_id
-------->title
-------->category
-------->img_download_url
------>clothing_id_1
-------->title
-------->...
我需要获取服装节点下的所有节点。
我的数据库安全规则目前是:
{
"rules": {
".read": "auth == null",
".write": "auth != null"
}
}
当调用包含此代码的方法时,onChildAdded
回调不是,而onCancelled
回调是带有权限被拒绝的数据库错误。为什么会这样?
答案 0 :(得分:1)
要显示该数据,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference clothingRef = rootRef.child("clothing");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<Clothing> clothingItems = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Clothing clothing = snapshot.getValue(Clothing.class);
clothingItems.add(clothing);
}
Log.d("TAG", clothingItems);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
clothingRef.addListenerForSingleValueEvent(eventListener);
答案 1 :(得分:0)
每当在任何节点中添加/删除/修改时,我们都应该使用onChildChanged回调方法而不是添加。在这个方法中,我们得到了DataSnapshot的实例,它具有新的所需数据。