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