2017-07-19 3 views
1

Ich habe die folgende denormalisierte Datenstruktur: Ein Kontakt kann mehrere Datensätze zuordnen. Ein Datensatz kann mehrere verknüpfte Kontakte enthalten (viele < -> viele Beziehung). Um den Überblick über ihre Beziehung, ein int Wert des Kontakts Rolle in einem bestimmten Datensatz zeigt an, und speichern Sie die Rolle Wert in zwei getrennten ReferenzenFirebaseIndexRecyclerAdapter - Wie erhält man den Wert jedes Schlüssels vom Schlüsselreferenzort?

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 

I FirebaseIndexRecyclerAdapter bin mit ist eine Liste der damit verbundenen Kontakte zu zeigen, eine bestimmte Record ID. Also für die Schlüsselreferenz würde ich Record_Role_Ref/record_id und für die Datenreferenz würde ich Kontakt verwenden, etwa so:

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

Begrenzung (e): Ich möchte nicht in jedem Kontakt die Rolle Wert speichern und Objekt aufzeichnen, da jedes Mal, wenn eine Rolle geändert wird, das gesamte Objekt des Kontakts und des Datensatzes abgerufen und aktualisiert worden wäre. Benutzer möchten sowohl Kontakte als auch Datensätze löschen, ändern, verschieben und Rollen ändern.

Problem (e): Der Rollenwert des Kontakts wird als Wert des Schlüssels in mRecordRoleRef gespeichert. Ist es möglich/wie bekomme ich den Wert aus der Schlüsselreferenz von FirebaseIndexRecyclerAdapter? Was ist die gute/beste Praxis in einer solchen Situation?

Dank im Voraus :)

Antwort

0

Ab sofort Ich bilde nur eine weitere Datenleseanforderung innerhalb des populateViewHolder Callback-Methode. Da die Datenleseanforderung selbst asynchron ist, bin ich mir noch nicht sicher, ob dies für eine große Liste funktionieren würde und wann die Ansicht recycelt werden würde. Der vom populateViewHolder zurückgegebene viewHolder wird auf final festgelegt.

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

        } 
       }); 
Verwandte Themen