简体   繁体   English

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

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

im working with firebase database.我正在使用 firebase 数据库。 i want to get specific data after searching from "data" node.我想从“数据”节点搜索后获取特定数据。 Below im sharing my database Screenshot and java function that i have already tried.下面我分享我的数据库截图和我已经尝试过的 java function。 I'm working on it from two days.我从两天开始就在处理它。 but i can't solve it.但我无法解决。 please help me.请帮我。 Thanks in advance.提前致谢。

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();
        }
    });

}

And this is my database structure.这是我的数据库结构。 i want to get "dataImage", "dataName" and "dataLink" after searching "dataName".我想在搜索“dataName”后获取“dataImage”、“dataName”和“dataLink”。

Firebase 数据库结构图

if you are using edit text for as a search box.如果您使用编辑文本作为搜索框。 add addTextChangedListener on edit text and you will get 3 methods on afterTextChanged method creat a function and pass it editable.tostring you get it in function.在编辑文本上添加 addTextChangedListener ,您将在 afterTextChanged 方法上获得 3 个方法创建一个 function 并将其传递给 editable.tostring 您在 function 中获得它。

and function code is: 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) {

        }
    });

Queries in the Firebase Realtime Database search the direct child nodes of the path you run them at for a value at a fixed path that you specify. Firebase 实时数据库中的查询在您运行它们的路径的直接子节点中搜索您指定的固定路径的值。

In your example, the path of the value in the JSON is not fixed as you have relevant nodes in data/01/dataName and data/02/dataName , which isn't possible.在您的示例中, JSON 中的值的路径固定,因为您在data/01/dataNamedata/02/dataName中有相关节点,这是不可能的。 Since the path that you order/filter on ( data/dataName ) doesn't even exist under Category/01 , so you won't get any results.由于您订购/过滤的路径( data/dataName )甚至在Category/01下都不存在,因此您不会得到任何结果。

If you want to allow this query on the database, you'll need to change the data structure (or add an additional one) where the values you want to order/filter on are at a fixed path under the direct child nodes of the path you query.如果要允许对数据库进行此查询,则需要更改数据结构(或添加额外的数据结构),其中要排序/过滤的值位于路径的直接子节点下的固定路径你查询。 So you'll have to lose a level of your JSON structure, but can keep the information by for example duplicating the categoryName value into each child node:因此,您将不得不丢失 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