2017-08-03 1 views
0

Intro: J'ai créé la base de données de mon application comme dans l'image ci-dessous.Android: Lire la clé du nœud enfant

enter image description here

Pour afficher les livres enregistrés de l'utilisateur que je suis en train de lire d'abord les clés des livres de l'utilisateur (situés dans user-books répertoire) et enregistrer toutes les clés dans un ArrayList donc je ne peux plus tard la charge (de books directory) les BookObjects correspondant à ces clés dans un fragment appelé MybooksFragment.

Note: Je suis en train d'obtenir et afficher ces clés dans un ListView comme vous pouvez le voir ci-dessous: (pour être sûr que je reçois les clés correctement)

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_my_books, container, false); 

    final ListView booksIdListView = (ListView) view.findViewById(R.id.booksIdListView); 

    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference databaseReference = database.getReference(); 

    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    String UID = user.getUid(); 

    databaseReference.child("books").child(UID).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      final List<String> booksId = new ArrayList<String>(); 

      for (DataSnapshot child: dataSnapshot.getChildren()) { 
       String userBookId = child.getKey(); 

       booksId.add(userBookId); 
      } 

      ArrayAdapter<String> myBooksAdapter = new ArrayAdapter<String>(getActivity() , 
    android.R.layout.simple_list_item_1 , booksId); 
      booksIdListView.setAdapter(myBooksAdapter); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Malheureusement le ListView reste vide (pas rempli avec des clés comme j'espérais). Qu'est-ce que je fais de mal?

Note: J'utilise ce modèle de base de données afin que je puisse esquiver les données en double

+0

Essayez d'utiliser firebase listadapter pour remplir les noeuds –

Répondre

1

Vous « essayez d'abord de lire les clés de livres de l'utilisateur (situé dans le répertoire-livres utilisateur) et enregistrer toutes les clés dans une ArrayList "mais vous ne le faites pas réellement.

Ainsi, afin d'y parvenir, vous devez changer votre référence comme celui-ci:

databaseReference.child("user-books").child(UID).addListenerForSingleValueEvent(new ValueEventListener() { 

Parce que le nœud dans lequel vous souhaitez interroger est user-books et pas simple books.

Pour conserver le code de la même façon qu'il est maintenant, vous devez faire un peu de changement dans votre base de données qui ressemble à ceci:

Firebase-root 
    | 
    --- user-books 
      | 
      --- userId1 
      |  | 
      |  --- bookId1: true 
      |  | 
      |  --- bookId2: true 
      |  | 
      |  --- bookId2: true 
      | 
      --- userId2 
       | 
       --- bookId4: true 
       | 
       --- bookId5: true 
       | 
       --- bookId6: true 

Vous avez uniquement besoin childrens les ids de livres uniques à la valeur de vrai.

Espérons que ça aide.

+0

C'était une erreur stupide de faire référence à des «livres» pour enfants. J'ai copié collé le eventListener de l'autre fragment qui recevait des objets de "livres" enfant et j'ai oublié de le modifier ici dans "user-books". Maintenant ça marche. Je ne peux pas croire à quel point j'étais stupide. Pourriez-vous s'il vous plaît re-phrase pourquoi aurais-je besoin d'ajouter des valeurs de true aux ID de livre? –

+0

Pour simplifier votre base de données. Vous n'avez pas besoin d'utiliser 'bookId' deux fois, une fois en tant que clé et une fois en tant que valeur de' bookId', vous pouvez simplement l'utiliser une seule fois. Vous serez en mesure d'obtenir ces enfants de la même manière parce que vous avez la clé comme le «livre id» et la valeur de vrai. –

+0

Merci Alex. –