我有以下两种方法来构建数据。想知道哪种方法是正确的,因为在每种情况下我都会遇到不同的限制。
案例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进行映射并且更加繁琐。
问题:有没有办法使用单个查询从两个节点获取数据?
所以我需要回答问题1 和问题2 ,并且需要了解哪种方法正确?
答案 0 :(得分:2)
Firebase建议避免嵌套数据(案例1),而是展平数据结构(案例2)。您可以在Structuring your Firebase data
中阅读更多内容引用Firebase本身'这是双向关系的必要冗余。它允许您快速有效地获取成员资格,即使用户或组列表可以扩展到数百万,或者实时数据库安全规则阻止访问某些记录。
这种方法通过将ID列为键来反转数据并将值设置为true,这使得检查密钥就像读取/ users / $ uid / groups / $ group_id一样简单,并检查它是否为空。索引比查询或扫描数据更快,效率更高。
所以,我认为案例2是要走的路。