繁体   English   中英

如何在android studio-java的firebase数据库中搜索得到子节点的具体数据?

[英]How to get specific data of child node by searching from firebase database in android studio - java?

我正在使用 firebase 数据库。 我想从“数据”节点搜索后获取特定数据。 下面我分享我的数据库截图和我已经尝试过的 java function。 我从两天开始就在处理它。 但我无法解决。 请帮我。 提前致谢。

private void getSearchedData(String selectedItem) {

    reference = FirebaseDatabase.getInstance().getReference().child("Category");
    Query query = reference.orderByChild("data/dataName").equalTo(selectedItem);

    ArrayList<ChannelData> channelDataArrayList = new ArrayList<>();

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            for (DataSnapshot requestSnapshot : snapshot.getChildren()) {
                DataSnapshot channelsSnapshot = requestSnapshot.child("data");

                for (DataSnapshot ds : channelsSnapshot.getChildren()) {
                    ChannelData channelData = new ChannelData(ds.child("dataName").getValue(String.class),
                            ds.child("dataImage").getValue(String.class));
                    channelDataArrayList.add(channelData);

                    searchAdapter adapter = new searchAdapter(channelDataArrayList, getApplicationContext());
                    rvSearchedChannel.setAdapter(adapter);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Toast.makeText(MainActivity2.this, "Error: " + error, Toast.LENGTH_SHORT).show();
        }
    });

}

这是我的数据库结构。 我想在搜索“dataName”后获取“dataImage”、“dataName”和“dataLink”。

Firebase 数据库结构图

如果您使用编辑文本作为搜索框。 在编辑文本上添加 addTextChangedListener ,您将在 afterTextChanged 方法上获得 3 个方法创建一个 function 并将其传递给 editable.tostring 您在 function 中获得它。

function 代码为:

FirebaseDatabase.getInstance().getReference().child("Category").child("data/dataName").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChildren())
            {
                list.clear();
                for (DataSnapshot dss : dataSnapshot.getChildren())
                {

                    Register register = dss.getValue(Register.class);
                    if (register.getUsername().toLowerCase().contains(s.toLowerCase())){
                        list.add(register);
                    }
                    if (Objects.equals(register.getId(), FirebaseAuth.getInstance().getCurrentUser().getUid())){
                        list.remove(register);
                    }

                }
                SearchUserAdapter adapter = new SearchUserAdapter(list, getContext());

                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
                search_rv.setLayoutManager(linearLayoutManager);
                search_rv.setAdapter(adapter);

       
                adapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

Firebase 实时数据库中的查询在您运行它们的路径的直接子节点中搜索您指定的固定路径的值。

在您的示例中, JSON 中的值的路径固定,因为您在data/01/dataNamedata/02/dataName中有相关节点,这是不可能的。 由于您订购/过滤的路径( data/dataName )甚至在Category/01下都不存在,因此您不会得到任何结果。

如果要允许对数据库进行此查询,则需要更改数据结构(或添加额外的数据结构),其中要排序/过滤的值位于路径的直接子节点下的固定路径你查询。 因此,您将不得不丢失 JSON 结构的级别,但可以通过例如将categoryName值复制到每个子节点中来保留信息:

CategoryData: {
  "0101": {
    CategoryName: "Pakistani",
    dataName: "News",
    ...
  },
  "0102": {
    CategoryName: "Pakistani",
    dataName: "Dramas",
    ...
  },
  "0201": {
    CategoryName: "India",
    dataName: "news",
    ...
  },
  "0202": {
    CategoryName: "India",
    dataName: "movies",
    ...
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM