【发布时间】:2017-08-17 23:17:29
【问题描述】:
请我想在 android 上使用搜索并像每个普通搜索一样检索数据...在输入字母时进行过滤。我在 Firebase 数据库上有我的数据。 “root - 用户 - UniqueID - (姓名,班级,年龄,能力)。我只想根据能力找到(过滤器)。我在firebase中仍然很新鲜。帮助我
【问题讨论】:
标签: android firebase firebase-realtime-database
请我想在 android 上使用搜索并像每个普通搜索一样检索数据...在输入字母时进行过滤。我在 Firebase 数据库上有我的数据。 “root - 用户 - UniqueID - (姓名,班级,年龄,能力)。我只想根据能力找到(过滤器)。我在firebase中仍然很新鲜。帮助我
【问题讨论】:
标签: android firebase firebase-realtime-database
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 区分大小写。因此,您需要有一个大写或小写版本的名称,然后确保您的所有搜索都转换为该大小写。
【讨论】:
试试这个。
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) {
}
});
【讨论】: