2017-07-19 1 views
1

J'ai la structure de données dénormalisée suivante: Un contact peut associer à plusieurs enregistrements. Un enregistrement peut avoir plusieurs contacts associés (beaucoup de relations < ->). Pour garder une trace de leur relation, une valeur int indique le rôle de contact dans un dossier particulier, et stocker la valeur de rôle dans deux références distinctesFirebaseIndexRecyclerAdapter - Comment obtenir la valeur de chaque clé à partir de l'emplacement de référence de la clé?

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 

j'utilise FirebaseIndexRecyclerAdapter est de montrer une liste de contacts associés à un identifiant d'enregistrement particulier. Donc, pour la référence clé que je voudrais utiliser Record_Role_Ref/record_id, et la référence de données j'utiliser le contact, comme ceci:

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

Limitation (s): Je ne veux pas stocker la valeur de rôle dans chaque contact et enregistrer un objet car chaque fois qu'un rôle est modifié, l'objet entier du contact et de l'enregistrement aurait été récupéré et mis à jour. Les utilisateurs veulent supprimer, modifier, déplacer à la fois le contact et les enregistrements, et modifier les rôles.

Problème (s): valeur de rôle du contact est stockée en tant que valeur de la clé dans le mRecordRoleRef. Est-il possible/comment obtenir la valeur de la référence de clé en cours avec FirebaseIndexRecyclerAdapter? Quelle est la bonne/meilleure pratique dans ce genre de situation?

Merci à l'avance :)

Répondre

0

A partir de maintenant, je forme juste une autre demande de lecture de données à l'intérieur de la méthode de rappel populateViewHolder. Étant donné que la requête de lecture de données est elle-même également asynchrone, je ne suis pas encore sûr si cela fonctionnerait pour une grande liste et quand la vue recycle. Le viewHolder retourné par le populateViewHolder est défini sur 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) { 

        } 
       });