2017-08-03 64 views
0

简介我创建了我的应用程序的数据库,如下图所示。Android:读取子节点的密钥

enter image description here

为了显示用户保存的书籍,我想先读取用户的书籍键(位于user-books目录),并保存所有这些密钥的一个ArrayList,所以我可以在以后的负载(从books目录)与名为MybooksFragment的片段中的这些键相对应的BookObjects。

注:我想获得和在ListView显示这些按键,你可以看到下面(要确保我得到正确的键)

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

     } 
    }); 

不幸ListView仍然是空的(没有像我希望的那样填充键)。 我在做什么错?

注:我使用这个数据库模型,所以我可以躲开的重复数据

+0

尝试使用Firebase的listadapter来填充节点 –

回答

1

你“首先尝试读取用户的书籍键(位于用户图书目录),并保存所有这些密钥的一个ArrayList“,但你实际上不这样做。

因此,为了实现这一点,你需要改变这样的你参考:

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

因为你要查询的节点user-books,而不是简单的books

为了保持代码相同的方式,因为它是现在,你需要在你的数据库中的变化不大,听起来是这样的:

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

你只需要与价值儿童的独特的书籍ID真实的。

希望它有帮助。

+0

这是一个愚蠢的错误来引用孩子“书籍”。我复制粘贴eventListener从其他片段获取对象从“书籍”的孩子,并忘记修改它在这里的“用户书籍”。现在它可以工作。我不敢相信我是多么的愚蠢。您能否重新说一句,为什么我需要为book ID添加true的值? –

+0

为了简化您的数据库。你不需要使用'bookId'两次,一次作为一个键,一次作为'bookId'的值,你可以只使用一次。因为您拥有'book id'和'true'的值,所以您将能够以相同的方式获得这些孩子。 –

+0

谢谢Alex。 –