我有以下非规范化数据结构: 联系人可以与多个记录关联。记录可以具有多个关联的联系人(多个< - >多个关系)。要跟踪它们之间的关系,可以使用int值来表示联系人在特定记录中的角色,并将角色值存储在两个单独的引用中
Contact
- Contact1:data
- Contact2:data
- Contact3:data
Record
- Record1:data
- Record2:data
Record_Role_Ref
- Record1
-- Contact1: roleA
-- Contact2: roleA
-- Contact3: roleD
- Record2
-- Contact1: roleB
Contact_Role_Ref
- Contact1
-- Record1: roleA
-- Record2: roleB
我使用FirebaseIndexRecyclerAdapter是为了显示特定记录ID的关联联系人列表。因此,对于关键引用,我将使用Record_Role_Ref / record_id,对于数据引用,我将使用Contact,如下所示:
// Setup the reference to the all the associated contact list in record_role_ref, using the record id as key
Query mRecordRoleRef = firebaseDatabase.getReference().child(DB_RECORD_ROLE_REF).child(mRecordId);
// Reference the Contact data ref
Query mContactRef = firebaseDatabase.getReference().child(DB_CONTACT);
FirebaseIndexRecyclerAdapter mContactAdapter = new FirebaseIndexRecyclerAdapter<Contact, ContactViewHolder>(Contact.class,
R.layout.item_contact,
ContactViewHolder.class,
mRecordRoleRef, // The Firebase database location containing the keys associated contacts to this record
mContactRef)// The Firebase database location to watch for data changes. Each key key found at keyRef's location represents a list item in the RecyclerView.
限制:我不想将角色值存储在每个联系人和记录对象中,因为每次更改角色时,联系人和记录的整个对象都将被提取和更新。用户希望删除,修改,移动联系人和记录以及更改角色。
问题(S): 联系人的角色值存储为mRecordRoleRef中密钥的值。是否有可能/如何使用FirebaseIndexRecyclerAdapter从关键参考中获取值?在这种情况下,什么是好/最佳做法?
提前致谢:)
答案 0 :(得分:0)
截至目前,我只是在populateViewHolder回调方法中形成另一个数据读取请求。由于数据读取请求本身也是异步的,我还不确定这是否适用于大型列表以及视图何时回收。 populateViewHolder返回的viewHolder设置为final。
Query mRecordContactRoleRef = firebaseDatabase.getReference().child(DB_RECORD_CONTACT_ROLE_REF).child(mRecordId).child(mContact.getContactId());
mRecordContactRoleRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Getting the role int base on record type
Long roleNum = (Long) dataSnapshot.getValue();
viewHolder.setContactRoleTv("hi, the role is " + roleNum);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});