Firebase Android中的Firebase搜索嵌套对象搜索

时间:2019-03-21 22:48:56

标签: java android firebase firebase-realtime-database

我想从所有“类别”子项中按子项“ title”的字符串值进行搜索:

database snapshot

我添加了如下数据库规则:

database rules snapshot

我尝试了以下代码:

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

        }
    });
}

1 个答案:

答案 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(/* ... */);

这样,您的级别就会降低,并且此查询会正常运行。