我正在尝试制作一个事件分拣机应用。我试图从数据库中抓取朋友arraylist,并在数据库中的每个朋友值下添加event_key。
final ArrayList<String> friends= new ArrayList<String>();
hello.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
friends.add(String.valueOf(dsp.getKey()));
}
mDatabaseUserEvents.child(invited_list).child(event_key).setValue(true);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
但是,我收到一条错误消息,指出ArrayList不兼容。
我试图瞄准的数据库结构是:
Events:
-User1:
-event_key:true
-User2:
-event_key:true
我很确定我需要使用for循环,但对如何实现它感到困惑。谢谢!
答案 0 :(得分:2)
由于Firebase是NoSQL数据库,因此它的结构为键和值对。所以每个孩子都是Map
而不是ArrayList。确实,您可以从数据库中获取值并存储到ArrayList中但不是以您的方式存储,因为onDataChange()
方法的异步行为,您的friends
ArrayList将始终如此是空的。这种情况正在发生,因为即使在尝试将这些值添加到该ArrayList之前,也会调用onDataChange()
方法。
如果您要为每个用户的所有true
设置event_key
,并假设Events
节点是Firebase数据库的直接子节点,请使用以下代码:< / p>
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference eventsRef = rootRef.child("Events");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String userKey = ds.getKey();
Log.d("TAG", userKey);
eventsRef.child(userKey).child("event_key").setValue(true);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
eventsRef.addListenerForSingleValueEvent(eventListener);