Firebase在不创建多个节点的情况下构建复杂列表数据

时间:2017-03-30 06:32:52

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

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

案例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 :为收件人和服务维护2种不同的结构。

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

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

Firebase建议避免嵌套数据(案例1),而是展平数据结构(案例2)。您可以在Structuring your Firebase data

中阅读更多内容

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

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

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