FirebaseIndexRecyclerAdapter - 如何从关键引用位置获取每个键的值?

时间:2017-07-19 19:05:34

标签: android firebase firebase-realtime-database firebaseui

我有以下非规范化数据结构: 联系人可以与多个记录关联。记录可以具有多个关联的联系人(多个< - >多个关系)。要跟踪它们之间的关系,可以使用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从关键参考中获取值?在这种情况下,什么是好/最佳做法?

提前致谢:)

1 个答案:

答案 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) {

                    }
                });