android - 如何按顺序将子项添加到 firebase 中的父项?

标签 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() 赋予 独特的元素将是一个问题标记。此外,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/

相关文章:

android - UserProfileChangeRequest setPhotoUri - 它是如何完成的?

javascript - 如何使用子字符串查询 firebase 键

android - 带有 Android NDK undefined reference 的 OpenCV

android - Coverflow android 一次可显示 3 个 View

json - Play & JSON : How to transform a sequence of (String, JsValue) 到 JsObject

jquery - jQuery 1.4.1 中缺少 JSON 字符串化?

ios - Swift:在应用程序之间共享身份验证状态

Android 7.1.2 隐式 Intent 'No apps can perform this action'

java - 通过 OnsharedPreferenceChangeListener 更新 TextView 中的文本

python - 使用python和cx_oracle读写Clob数据