【问题标题】:Firebase database doing an SQL "like" query with deeply nested childsFirebase 数据库使用深度嵌套的子项执行 SQL“类似”查询
【发布时间】:2020-01-24 17:59:18
【问题描述】:

我有一个编辑文本。我正在观察每个字母的文本变化,并且对于添加的每个字母,我想查询对 firebase 的请求,给我添加了这些字母的结果。所以我尝试了这里提供的以下解决方案 -

How to do a simple search in string in Firebase database?

它似乎不起作用。

我的数据库中有这些 JSON 配置文件:


{
  "002xUGm1uRXDYc8JpEy7AKFWFyy2" : {
    "contest_uid" : "-LRoyQlTw5vo3CIE3tfb",
    "created_at" : 1543726522,
    "device_id" : "354020096008438",
    "email" : "koushickroy321@gmail.com",
    "is_suspended" : false,
    "is_uploading" : false,
    "last_login_at" : 1543726522,
    "last_upload_started_at" : 0,
    "name" : "gold rush eren patym cash patym",
    "photoUrl" : "*"
  },
  "00IumwilishPwTgPUXX6GmveP5w2" : {
    "contest_uid" : "-LRoyQlTw5vo3CIE3tfb",
    "created_at" : 1543214441,
    "device_id" : "865758030661505",
    "email" : "khushyouheart@gmail.com",
    "is_suspended" : false,
    "is_uploading" : false,
    "last_login_at" : 1543214441,
    "last_upload_started_at" : 0,
    "name" : "Khushal Chouhan",
    "photoUrl" : "*"
  },
  "00TRPNqSi1R41F4SUuhHOgHBdkN2" : {
    "contest_uid" : "-LO3Eg7zf1xh9RGDUy0e",
    "created_at" : 1541355818,
    "device_id" : "357149084088198",
    "is_suspended" : false,
    "is_uploading" : false,
    "last_login_at" : 1541355818,
    "last_upload_started_at" : 0,
    "name" : "Gagan Singh Gaur",
    "photoUrl" : "*"
  },


这是我已经尝试过的 -


mExploreSearchEditText.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

      }

      @Override
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {


      }

      @Override
      public void afterTextChanged(Editable editable) {
          if (editable.length() < 1) {
            mExploreSearchRecommendedProfiles.setVisibility(View.VISIBLE);
            fetchSixRandomProfiles();
          } else {
            mExploreSearchRecommendedProfiles.setVisibility(View.GONE);
            fetchNewListFromEditable(editable);
          }
      }
    });
  }

  private void fetchNewListFromEditable(Editable editable) {
    String text = editable.toString();
    Query query = FirebaseDatabase.getInstance().getReference().child("profiles").orderByChild("").startAt(text).endAt(text +"\uf8ff");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
          String users = dataSnapshot.getValue(String.class);
          Timber.tag("similar users").d(users); // <-- I have never got to this point 
        } else {
          Toast.makeText(App.getAppContext(), "snapshot does not exist", Toast.LENGTH_SHORT).show();
        }
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {
        Timber.tag("similar users error - " + databaseError.getMessage());
      }
    });
  }


我需要的是对于添加的每个字母,查询整个“配置文件”表,如果配置文件的名称包含从开始的整个字符序列,那么我需要名称和 photoURL。实现这一结果的最佳方法是什么?

【问题讨论】:

  • @FrankvanPuffelen 谢谢 - 我已经编辑了我的帖子。能否请您重新打开此主题以便人们回答?
  • 这毫无意义:orderByChild("")。老实说,它应该引发异常,但绝对行不通。您要订购哪个子属性?指定该属性。可能是orderByChild("name"),但只有你自己知道。
  • 还要注意这里有很多东西。虽然我可能可以帮助您使您的查询正常工作,但我并不总是最能帮助您处理 Android UI 元素。最好是尽量减少回答问题所需了解的技术数量。 IE。如果您可以用硬编码的搜索字符串重现您的问题,并且只记录输出,那么只有数据库知识的人更有可能提供帮助。

标签: android firebase-realtime-database


【解决方案1】:

这样的事情应该可以解决问题:

Query query = FirebaseDatabase.getInstance().getReference().child("profiles").orderByChild("name").startAt(text).endAt(text +"\uf8ff");
query.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    if (dataSnapshot.exists()) {
      for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
        String users = snapshot.child("name").getValue(String.class);
        Timber.tag("similar users").d(users);
      }
    } else {
      Toast.makeText(App.getAppContext(), "snapshot does not exist", Toast.LENGTH_SHORT).show();
    }
  }

  @Override
  public void onCancelled(@NonNull DatabaseError databaseError) {
    Timber.tag("similar users error - " + databaseError.getMessage());
  }
})

变化:

  • 使用orderByChild("name") 根据name 属性的值对配置文件进行排序/过滤。
  • onDataChange 中循环子级,因为一个查询可以有多个结果。
  • 你需要从每个子快照中获取正确的属性值,所以snapshot.child("name").getValue(String.class)

我还没有做的事情:

  • 在搜索结果中显示用户列表。如果您需要,请查看创建您自己的适配器并调用 notifyDataSetChanged()

【讨论】:

  • 非常感谢。你的解释很好,我非常感谢!解决了。​​
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多