【问题标题】:How to add child to the parent in firebase sequentially?如何按顺序将孩子添加到firebase中的父母?
【发布时间】:2015-10-31 06:48:43
【问题描述】:

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

{
"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()creates 实例因此假设一个用户执行所有三个操作,它将拥有它的三个实例而不是一个。

我的解决方案

假设 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"}}}}

但同样,这个解决方案有一些限制,我将无法从另一个用户那里获取其他用户的数据。我需要知道所有成员将参加活动的地方。

【问题讨论】:

    标签: android json firebase


    【解决方案1】:

    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);
        }
      }
    });
    

    【讨论】:

    • 先生,感谢您的回复。我知道push(),但是在检索数据时,提取push() 给出唯一标签的元素将是一个问题。此外,push() 会创建每个调用的实例,因此假设一个用户执行所有三个操作,它将拥有它的三个实例而不是一个。
    • 以上代码将在rsvp下创建一个单节点。如果您在阅读推送项目时遇到问题,请包含您用来阅读的代码。我将添加一些 sn-ps,但请注意 StackOverflow 不太适合交互式问答会话。
    【解决方案2】:

    { "rsvp": {"id"="id","event": "event_here","name": "name_here","rsvp": "going"}} 更改您的 json 只需检查 id,如果 id 已存储,则更新特定 id 的数据,否则存储所有数据

    【讨论】:

    • 好的,所以每次我需要调用 json 文件时提取数据,然后查看它是否相等。那么在那之后呢?问题是添加一个新项目,当使用 push 命令时,它会添加它自己的关键字
    【解决方案3】:
        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);
    

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多