【问题标题】:Showing Specific Data in by using the key in Firebase使用 Firebase 中的键显示特定数据
【发布时间】:2019-03-21 07:20:08
【问题描述】:

我是 android 开发和 firebase 的新手,所以这可能是一个简单的问题。

我想开发一个与 firebase 中的 grandChild 中的名称匹配的应用程序,然后获取它周围的键的数据,但问题是当我检索数据时,它会获取数据库中所有子节点的值。

这是我完成的代码

private void searchText() {
    final String mSearch = searchBar.getText().toString();

    //return REQUIRED if the searchBar is in filled
    if (TextUtils.isEmpty(mSearch)) {
        searchBar.setError(REQUIRED);
        return;
    }


    ValueEventListener valueEventListener = mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot child : dataSnapshot.getChildren()){


                for (DataSnapshot grandChild : child.getChildren()) {


                    //check if mSearch is equal any grandchild in the firebase'
                    if(grandChild.getValue().toString().equals(mSearch)){

                        TextView mText = findViewById(R.id.searchResult);
                        String string = child.getValue().toString();
                        String string2 = string.replace("{","");
                        String string3 = string2.replace("}","");
                        String string4 = string3.replace(",","\n");

                        //retrieve the data from firebase and show in TextView
                        mText.setText(string4);
                    }
                }

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    mDatabase.addValueEventListener(valueEventListener);
}

结果

{ Message = "...",Priority = "..",name="...",time="..."}

我想要的结果只有名称和优先级

{ Message = "..",name=".."}

有没有办法指定检索数据的路径?

【问题讨论】:

  • 这就像我必须在编辑文本上输入名称,它会与 grandChild (在这种情况下是“aa”)如果它相等,我希望我的应用程序只显示textView 上的消息和名称

标签: java android firebase firebase-realtime-database


【解决方案1】:

您可以通过您的孙子进行查询。 假设您想从数据库中按 name 进行搜索。为此,请按照以下代码进行操作

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Data");

        Query query = databaseReference.orderByChild("name")
             .startAt(mSearchText)
             .endAt(mSearchText+"\uf8ff");

        query.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    for (DataSnapshot data:dataSnapshot.getChildren()){

                         String name = data.child("name").getValue().toString();
                         String priority = data.child("Priority").getValue().toString();

                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

【讨论】:

    【解决方案2】:

    为什么不先将 JSON 解析成一个对象,然后只使用所需的参数。 对于解析,您可以使用 SimpleJSON 库。

    【讨论】:

      【解决方案3】:

      为了能够检索nameMessage,您可以执行以下操作:

      DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Data");
      databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
           if(dataSnapshot.child("name").getValue().toString().equals(mSearch)){
             String message = dataSnapshot.child("Message").getValue().toString();
              mText.setText(message);
               }
          }
      
      @Override
      public void onCancelled(DatabaseError databaseError) {
         }
      });
      

      在上面的代码中,您将能够检索namemessage,然后检查name 是否等于搜索栏中写入的值。之后,您可以将message 分配给TextView

      【讨论】:

      • 所以我不必执行 for 循环来获取我想要的数据对吧?
      • 如果当前节点和要获取的数据之间有一个节点,例如如果您有“Data/id/name:aa”,则执行 for 循环。在这种情况下,您执行了一个 for 循环,但在您的数据库中,您的孩子立即位于“数据”下
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多