【问题标题】:Android: Read child node's keyAndroid:读取子节点的密钥
【发布时间】:2017-08-03 12:43:41
【问题描述】:

简介我已经创建了我的应用程序的数据库,如下图所示。

为了显示用户保存的书籍,我首先尝试读取用户的书籍密钥(位于 user-books 目录中)并将所有这些密钥保存在 ArrayList 中,以便稍后加载(来自 books 目录) BookObjects 对应于名为MybooksFragment 的片段中的这些键。

注意:我正在尝试在 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 仍然是空的(没有像我希望的那样填充键)。 我做错了什么?

注意:我正在使用这个数据库模型,所以我可以避免重复数据

【问题讨论】:

  • 尝试使用 firebase listadapter 填充节点

标签: android firebase firebase-realtime-database key


【解决方案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,其值为 true。

希望对你有帮助。

【讨论】:

  • 引用儿童“书籍”是一个愚蠢的错误。我从其他片段中复制粘贴了 eventListener,该片段从“books”子级获取对象并忘记在“user-books”中修改它。现在它起作用了。不敢相信我是多么愚蠢。您能否重新解释一下为什么我需要将 true 值添加到图书 ID 中?
  • 简化您的数据库。您不需要使用bookId 两次,一次作为键,一次作为bookId 的值,您只需使用一次即可。您将能够以相同的方式获取这些孩子,因为您拥有 book id 的密钥和 true 的值。
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2022-01-24
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多