【问题标题】:Firebase Structuring Complex List Data Without Creating Multiple NodesFirebase 在不创建多个节点的情况下构建复杂的列表数据
【发布时间】:2017-08-23 22:14:08
【问题描述】:

我有以下两种构建数据的方法。想知道哪种方法是正确的,因为在每种情况下我都遇到了不同的限制。

案例 1:嵌套对象 - 此处推送单个对象,以维护与收件人相关的所有记录。与收件人相关的所有数据都可以在单个“查询”中获取,可以传递给 Firebase-Ui (FirebaseRecyclerAdapter)

问题:将数据添加到“servicesArrayList”。因为它是基于索引的 (0,1,2,...)。新推送将添加 pushId (-KgJoRXVUP_-Z0gLhIWy)。打破结构(参考下面的代码)。现在在检索数据时崩溃。 (将数据反序列化为结构需要 ArrayList 时的问题)

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    Recipient recipient = dataSnapshot.getValue(Recipient.class);
}

问题:有没有办法在新推送时维护索引,或者在第一次推送时它可以以某种不同的方式构建?

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getUid();

Query query = FirebaseDatabase.getInstance()
            .getReference(RECIPIENT_NODE)
            .child(uid)
            .orderByChild("billNo")
            .equalTo(135);

recipient // parent Node

   2R1Q8qKEPHXFU1OiMq5TyxHBaZa2 // uId

     -KgJhMAWADwownv5tck6  // push Ids
     -KgJhMAWADwownv5tck6
     -KgJoD77HQK-yACD_EuB
     -KgJoRXVUP_-Z0gLhIWy
     -KgJob82t47PvTjfTtig
     -KgK-N_Av_2kmmQS0Ulx

     -KgNu-fVWwFDLnRENj_b // Recipient Data
          billNo: 135
          billingMonth: "July 2017"
          childName: "xyz"
          date: "29/03/2017"
          fineAmount: 0
          paymentStatus: "UNPAID"
          pushId: "-KgNu-fVWwFDLnRENj_b"
          recipientEmail: "abc@gmail.com"
          recipientName: "Abc C."
          servicesArrayList
                       -0                 //added when recipient object was pushed
                          -amount: 1000
                          -charges: "1000"
                          -noOfSessions: 1
                          -serviceType: "Speech And Language Assessment"
                      -1                  //added when recipient object was pushed
                          -amount: 1200
                          -charges: "600"
                          -noOfSessions: 2
                          -serviceType: "Group Sessions"

                      -KgJoRXVUP_-Z0gLhIWy // added as an update to exsiting list (errrr ! now structure is breaking.)
                          -amount: 1200
                          -charges: "600"
                          -noOfSessions: 2
                          -serviceType: "Group Sessions"

          vat: 0

案例 2:为 Recipient 和 Services 维护 2 个不同的结构。

问题:必须触发 2 个不同的“查询”。分别合并 2 个数据,然后将其传递给普通适配器(不能使用 Firebase-ui)。使用 ChildListener / ValueeventListener 进行监控。 使用 FOREIGN KEY 进行映射,比较繁琐。

问题:有没有办法使用单个查询从两个节点获取数据?

所以我需要问题 1问题 2 的答案,并且需要了解哪种方法是正确的?

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-authentication firebaseui


    【解决方案1】:

    Firebase 建议避免嵌套数据(案例 1),而是扁平化数据结构(案例 2)。你可以在Structuring your Firebase data阅读更多内容

    引用 Firebase 本身'这是双向关系的必要冗余。即使用户或组的列表扩展到数百万或实时数据库安全规则阻止访问某些记录时,它也可以让您快速有效地获取成员资格。

    这种方法通过将 ID 列为键并将值设置为 true 来反转数据,使得检查键就像读取 /users/$uid/groups/$group_id 并检查它是否为空一样简单。与查询或扫描数据相比,索引速度更快、效率更高。

    所以,我想案例 2 是要走的路。

    【讨论】:

    • 是的,我浏览了 Firebase 文档。如果您在案例 2 中看到,如果我想显示包含一些服务详细信息的收件人列表,或者如果我想使用基于服务的过滤器为收件人使用过滤器,我必须进行太多 Firebase 调用。实在是太麻烦了!
    • @NayaneshGupte 你问过 Firebase 的人吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2018-09-16
    • 2017-11-26
    • 2015-01-21
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多