我想从所有“类别”子项中按子项“ title”的字符串值进行搜索:
我添加了如下数据库规则:
我尝试了以下代码:
public void getData(String search_key) {
dbref.child("data").orderByChild("title").startAt(search_key).endAt(search_key + "\uf8ff").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String title = null;
for (DataSnapshot data:dataSnapshot.getChildren()) {
for (DataSnapshot dataCategory:data.getChildren()) {
try {
Object object = dataCategory.child(DBConstants.CHILD_TITLE).getValue();
if (object != null) title = object.toString();
} catch (NullPointerException e) {
//comments
}
System.out.println(title);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
答案 0 :(得分:0)
由于您的data
节点与包含title
属性的对象之间还有一个子节点Category
,因此无法使用数据库结构来实现这一目标。 / p>
您可以使用以下查询:
dbref.child("data").child("Category1")
.orderByChild("title")
.startAt(search_key)
.endAt(search_key + "\uf8ff")
.addListenerForSingleValueEvent(/* ... */);
只循环一次 ,而不是像现在的代码那样循环两次,但是您将只能获得Category1
节点中存在的标题。如果要获取所有标题,则应通过将类别添加为对象的属性来重组数据库,然后只需使用:
dbref.child("data") //No Category1 child
.orderByChild("title")
.startAt(search_key)
.endAt(search_key + "\uf8ff")
.addListenerForSingleValueEvent(/* ... */);
这样,您的级别就会降低,并且此查询会正常运行。