我不知道标题是否有意义,所以我会尽量在这里详细说明我的问题。
{
"rsvp":[
{"event": "event1","name": "name1","rsvp": "going"},
{"event": "event2","name": "name2","rsvp": "going"}
]
}
我想以上述格式存储数据,如果该项目来自同一用户,它应该覆盖,但我现在得到的是
{ "rsvp": {"event": "event_here","name": "name_here","rsvp": "going"}}
并且无论用户如何,每次值都会更新。
这是我的代码实现
final Firebase firebase = new Firebase(Constant.FIREBASE_URL).child("rsvp");
final HashMap<String, String> map1 = new HashMap<>();
map1.put("rsvp", "going");
map1.put("name", mUserName);
map1.put("event", title);
firebase.setValue(map1);
请告诉我哪里做错了。谢谢。
更新 1
我知道 push()
但是在检索数据时提取 push()
赋予 独特的元素将是一个问题标记
。此外,push()
创建每个调用的实例,因此假设一个用户执行所有三个操作,它将拥有三个实例而不是一个。
我的解决方案
假设 firebase 不支持我在这里寻找的东西..
这里我们知道 UID
以及我计划为其添加 rsvp 的 event
。
所以我计划按以下方式制作数据结构,
{"rsvp":{"uid1":{"event1":{"status":"going","email":"someemail@email.com"},"event2":
{"status":"maybe","email":"someemail@email.com"}},
"uid1":{"event1":{"status":"going","email":"someemail@email.com"},"event2":
{"status":"maybe","email":"someemail@email.com"}}}}
但是这个解决方案同样有限制,我无法从另一个用户那里获取其他用户的数据。我需要在哪里知道所有成员都将参加 Activity 。
最佳答案
Firebase 在处理数组方面有一个不寻常的地方。这是因为数组在分布式多用户系统(例如 Firebase)中天生难以扩展。如果您想了解更多信息,请阅读 Firebase documentation on arrays and lists 的这一部分.
我建议不要将数据存储在数组(具有数字、顺序键)中,而是将其存储在 Firebase 列表中。 Firebase 列表使用字母数字键。尽管如此,它们仍然总是递增,所以就像数组索引一样,它们非常适合存储顺序数据。
final Firebase firebase = new Firebase(Constant.FIREBASE_URL).child("rsvp");
final HashMap<String, String> map1 = new HashMap<>();
map1.put("rsvp", "going");
map1.put("name", mUserName);
map1.put("event", title);
firebase.push().setValue(map1);
这里唯一的区别是最后一行使用 push()
来生成一个新的 child 。 key 将是一个字符串(当前以 -K
开头),称为推送 ID。如果您想了解更多信息,请阅读 push ids - the 2^120 ways to ensure unique identifiers 上的这篇博文。 .
如果您继续使用 push().setValue(...)
将您的事件添加到列表中,它们将按照您添加它们的顺序显示。就像使用数组索引一样,但现在采用了一种在许多用户同时添加事件时也适用的方法。
更新
要读取 event1
的所有响应:
Query query = firebase.orderByChild("event").equalTo("event1");
query.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot rsvpSnapshot) {
for (DataSnapshot snapshot: rsvpSnapshot.getChildren()) {
String name = snapshot.child("name").getValue(String.class);
String rsvp = snapshot.child("rsvp").getValue(String.class);
System.out.println(name+": "+rsvp);
}
}
});
关于android - 如何按顺序将子项添加到 firebase 中的父项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448880/