2017-07-19 15 views
1

私は次の非正規化データ構造を持っています: 連絡先は複数のレコードに関連付けることができます。レコードには複数の連絡先(多くは< - >多数の関係)を持つことができます。彼らの関係を追跡するために、int型の値は、特定のレコード内の連絡先の役割を示し、2つの別々の参照FirebaseIndexRecyclerAdapter - キー参照場所から各キーの値を取得する方法?

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を使用して、データ参照のために私はそうのように、連絡先を使用します。

// 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. 

制限(秒):私は、それぞれ接触してロール値を格納する必要はありませんロールを変更するたびに連絡先とレコードのオブジェクト全体がフェッチされ更新されるため、オブジェクトを記録します。ユーザーは、連絡先とレコードの両方を削除、変更、移動し、役割を変更したい。

問題: 連絡先のロールの値は、キーの値としてmRecordRoleRefに格納されます。 FirebaseIndexRecyclerAdapterでオンザフライでキーリファレンスから値を取得することは可能ですか?このような状況で、良い/ベストプラクティスは何ですか?事前に

感謝:)

答えて

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

        } 
       }); 
関連する問題