【问题标题】:I want to use a regular search method to filter / find users in my firebase database. But am clueless我想使用常规搜索方法在我的 firebase 数据库中过滤/查找用户。但我一无所知
【发布时间】:2017-08-17 23:17:29
【问题描述】:

请我想在 android 上使用搜索并像每个普通搜索一样检索数据...在输入字母时进行过滤。我在 Firebase 数据库上有我的数据。 “root - 用户 - UniqueID - (姓名,班级,年龄,能力)。我只想根据能力找到(过滤器)。我在firebase中仍然很新鲜。帮助我

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    Firebase 不会像常规 SQL 类型的数据库那样让您搜索通配符。

    使用 firebase 可以做的最好的事情就是在单词的开头进行匹配。

    搜索名称“sketchthat”的示例。

    firebase
      .database()
      .ref('/users/')
      .orderByChild('name')
      .startAt('s')
      .endAt('t')
    

    这将为您带来所有以s 开头的名字。

    您可以对其进行优化(Javascript 中的示例)

    var searchPhrase = 'sketch';
    var searchEnd = searchPhrase.charCodeAt(searchPhrase.length - 1); // Gets the ASCII value.
    var endAtPhrase = searchPhrase.substr(0, searchPhrase.length - 1) + String.fromCharCode(searchEnd + 1); // Next character in the list "sketci"
    
    firebase
      .database()
      .ref('/users/')
      .orderByChild('name')
      .startAt(searchPhrase)
      .endAt(endAtPhrase)
    

    此解决方案的问题是 firebase 区分大小写。因此,您需要有一个大写或小写版本的名称,然后确保您的所有搜索都转换为该大小写。

    【讨论】:

      【解决方案2】:

      试试这个。

      editext.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) {
                  String str = charSequence.toString();
      
                  final FirebaseDatabase database = FirebaseDatabase.getInstance();
                  DatabaseReference ref = database.getReference().child("root").child("users");
      
                  ref.orderByChild("name")
                          .startAt(str)
                          .endAt(str+"\uf8ff")
                          .addListenerForSingleValueEvent(new ValueEventListener() {
                              @Override
                              public void onDataChange(DataSnapshot dataSnapshot) {
                                  for(DataSnapshot child: dataSnapshot.getChildren()){
                                     //get data
                                  }
      
                              }
      
                              @Override
                              public void onCancelled(DatabaseError databaseError) {
      
                              }
                          });
              }
      
              @Override
              public void afterTextChanged(Editable editable) {
      
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2019-01-25
        • 2018-02-01
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        • 2020-07-27
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多