簡體   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