如何从firebase数据库中检索特定值?

时间:2017-07-13 16:22:58

标签: android firebase firebase-realtime-database

我正在通过我的应用程序中的searchview从firebase数据库中检索用户名。它给了我输出。但问题是我在吐司中显示了一条消息"用户未找到"只要用户名在数据库中不可用,就应该显示该信息。但它显示了用户名是否可用的时间。我不知道如何解决它。 这是我的代码:

databaseReference = FirebaseDatabase.getInstance().getReference("Users");
    databaseref = databaseReference.child("usernames");

    searchView.setOnQueryTextListener(new 
android.widget.SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(final String query) {

            if(CheckNetwork.isInternetAvailable(Search.this))
            {
                databaseref.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

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

                           name = data.getKey().toString();
                           pic = data.child("image").getValue(String.class);
                           id = data.child("id").getValue(String.class);

                             if(query.equals(name)) {

                                 textView.setText(name);


 Picasso.with(getApplicationContext()).load(pic).fit().centerCrop().into
(imageView);
                             }
 else {
 Toast.makeText(Search.this, "No user found", Toast.LENGTH_SHORT).show();
                             }

                         }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }
            else {
 Toast.makeText(Search.this,"No internet 
 Connection",Toast.LENGTH_SHORT).show();
            }

            return true;
        }

这是我的数据库图片:Image

4 个答案:

答案 0 :(得分:0)

您尚未按用户名过滤用户列表:

databaseref.child(query).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       name = dataSnapshot.getKey().toString();
       pic = dataSnapshot.child("image").getValue(String.class);
       id = dataSnapshot.child("id").getValue(String.class);

您会注意到我删除了循环,因为在这种情况下,侦听器附加到特定位置:您在搜索框中输入其名称/密钥的用户的节点。

如果您要过滤名称/键搜索框中的内容开头的用户,而不是特定值,则需要数据库查询:

databaseref.orderByKey().startAt(query).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
           name = userSnapshot.getKey().toString();
           pic = userSnapshot.child("image").getValue(String.class);
           id = userSnapshot.child("id").getValue(String.class);

答案 1 :(得分:0)

当您在搜索框中输入值时,您现在指定了节点,因此无需循环屏幕截图值相当于您要查找的值,因此您可以直接说:       dataSnapshot.child("image")getValue(String.class)

答案 2 :(得分:0)

对于您当前的代码,问题是您正在烘烤"用户未找到"在完成所有快照的解析之前。例如:如果您的用户是您的代码将显示的第二个快照"用户未找到"对于第一个快照而不检查第二个快照。因此,您可以通过使用布尔值设置为true来更改它,如果找到并在for循环后检查该布尔值。喜欢:

Boolean userFound = false;

for(DataSnapshot data : dataSnapshot.getChildren())
                  {
                       name = data.getKey().toString();
                       pic = data.child("image").getValue(String.class);
                       id = data.child("id").getValue(String.class);
                         if(query.equals(name)) {
                             textView.setText(name);
                             userFound = true;
                             Picasso.with(getApplicationContext()).load(pic).fit().centerCrop().into(imageView);
                         }

                     }
 if(!userFound){
                Toast.makeText(Search.this, "No user found", Toast.LENGTH_SHORT).show();
}

还有一个更好的解决方案,你没有必要解析所有用户,尝试@Frank van Puffelen回答。 您可以通过databaseRef.child("query");直接与孩子联系。

答案 3 :(得分:0)

我找到了解决方案:)

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

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

                            name = data.getKey().toString();
                            pic = data.child("uri").getValue(String.class);
                            id = data.child("id").getValue(String.class);
              }

     if(query.equals(name)) {

     textView.setText(name);

 Picasso.with(getApplicationContext()).load(pic).fit().centerCrop().into
 (imageView);
           }
     else {
 Toast.makeText(Search.this, "No user found", Toast.LENGTH_SHORT).show();
         }

         }

  @Override
  public void onCancelled(DatabaseError databaseError) {

                    }
                });