我正在开发一个使用Firebase作为后端的Android应用。
我是Firebase的新手并且遇到了问题,问题是当我尝试使用NOT IN
查询搜索记录时,它会返回不以我输入的关键字开头的结果。
这是数据集
startAt
这是代码snippit
itemname
-KK8vI8A5BZZp3Xo3FpA
name: "abc"
-KK8w3uoJdJ0hBSrq0CS
name: "test"
-KKAC1o9Vazyg9JLtDoQ
name: "dude"
因此,当我搜索Query query = firebase.child(Constants.KEY_ITEM_NAME).orderByChild("name").startAt("abc");
query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Iterator<DataSnapshot> i = dataSnapshot.getChildren().iterator();
while (i.hasNext()) {
DataSnapshot d = i.next();
LOG(d.getKey(), d.getValue().toString());
}
}
时,回复中还包含abc
。
也许我做错了什么或者我做错了路。
有谁能指出我正确的方向。
P.S我正在尝试使用test
来搜索项目。
由于
答案 0 :(得分:5)
当您致电$ git checkout --track newfeature
fatal: Missing branch name; try -b
$ git checkout newfeature
error: pathspec 'newfeature' did not match any file(s) known to git.
时,数据库按名称属性对所有项目进行排序,跳过orderByChild("name").startAt("abc")
之前的项目,然后将其全部返回。
如果您只想找回与abc
匹配的孩子,则您使用abc
:
equalTo()
答案 1 :(得分:0)
不幸的是,你无法做你想做的事。我假设你要搜索的方法是startsWith()
而不是startAt()
(以匹配以子字符串开头的所有单词)。这个方法还没有在Firebase中实现,太糟糕了。
你必须使用像ElasticSearch这样的外部服务,但这意味着你必须拥有一台服务器,这可能是你实际使用firebase的原因之一......无论如何,这是一个实现ElasticSearch的链接:
https://firebase.googleblog.com/2014/01/queries-part-2-advanced-searches-with.html
否则你将不得不弄清楚如何摆脱你的搜索栏......
祝你好运!答案 2 :(得分:0)
为我工作:
Query query = MyApplication.sReferenceOrders.orderByChild(Constants.STATUS).startAt("1").endAt("1\\uf8ff");
答案 3 :(得分:0)
我认为您正在尝试为您的应用实施搜索功能.. 这是我的查询
private void searchForMatch(String keyword) {
Log.d(TAG, "SearchForMatch: searching for match");
mUserList.clear();
if (keyword == null) {
mUserList.clear();
} else {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("where you want to search in database ")
.orderByChild("what do you want search from your database").startAt(keyword).endAt(keyword + "\uf8ff");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot singlesnapshot : dataSnapshot.getChildren()) {
Log.d(TAG, "onDataChange: found user" + singlesnapshot.getValue(User.class).toString());
mUserList.add(singlesnapshot.getValue(User.class));
this is my list adapter for displaying search results // updateUsersList();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
如果您不知道它是如何运作的,请查看this tutorial on youtube.
答案 4 :(得分:-1)
我也在寻找这个解决方案,谢谢。 我尝试过,甚至可以使用它:
startAt('ab').endAt('ab\w|\W');