如何在firebase中顺序添加child到父级?

时间:2015-10-31 06:48:44

标签: android json firebase

我不知道标题是否有意义,所以我会在这里详细说明我的问题。

{
"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()给出unique tag的元素会有问题。此外,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"}}}}

但是这个解决方案再次受到限制,我将无法从另一个用户的数据中获取其他用户的数据。我需要知道所有成员参加活动的地方。

3 个答案:

答案 0 :(得分:3)

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()来生成一个新孩子。密钥将是一个字符串(当前以-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);
    }
  }
});

答案 1 :(得分:0)

{&#34; rsvp&#34;:{&#34; id&#34; =&#34; id&#34;,&#34; event&#34;:&#34; event_here&#34;, &#34; name&#34;:&#34; name_here&#34;,&#34; rsvp&#34;:&#34; go&#34;}} 更改您的json只需检查id,如果id是store,则更新特定id的数据,否则存储所有数据

答案 2 :(得分:0)

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef;
    myRef=database.getReference().push().child("Email");
    myRef.setValue(nameValue);
    String key=myRef.getParent().getKey();
    myRef=database.getReference(key).child("Password");
    myRef.setValue(passwordValue);