我想使用常规搜索方法来过滤/查找我的firebase数据库中的用户。但我一无所知

时间:2017-08-17 03:43:48

标签: android firebase firebase-realtime-database

我想在android上使用搜索并检索每个普通搜索工作的数据...在输入字母时过滤。我有关于Firebase数据库的数据。 “root - users - UniqueID - (名称,类,年龄,能力)。我只是想根据能力找到(过滤)。我的firebase还是新鲜的。帮帮我

2 个答案:

答案 0 :(得分: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区分大小写。因此,您需要使用名称的大写或小写版本,然后确保将所有搜索转换为该情况。

答案 1 :(得分:0)

试试这个。

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) {

        }
    });