正在使用新的firebase数据库框架开发android应用程序。它有如下建模的数据对象:
android - 如何在Google Firebase数据库中使用过滤器和子元素-LMLPHP
其中,最上面的父项(1234-4321)是“聊天室”,数据对象是“聊天消息”,编号的项(0、1、2)是“单个消息”。
我可以毫不费力地获取整个数据库,并通过侦听器读取:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
myRef.addChildEventListener(this);
myRef.addValueEventListener(this);

我可以用这种方式得到一个孩子:
FirebaseDatabase database = FirebaseDatabase.getInstance();
String id = "1234-4321";
DatabaseReference myRef = database.getReference().child(id);
myRef.addChildEventListener(this);
myRef.addValueEventListener(this);

但我一辈子都不知道如何得到同一类型的多个对象。我的意思是,用户可以获得多个聊天室(即“1234-4321”和“1234-4432”),但我能看到的唯一方法是:
1)循环遍历onchildadded或ondatachange侦听器,通过匹配字符串id来分离项目,并更新它们。但是,这是非常低效的,因为我正在解析整个数据库,它可能非常大
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    if(dataSnapshot != null){
        try {
            ChatObjectV2 objectV2 = (ChatObjectV2) dataSnapshot.getValue();
            //Check here for ids and loop through everything
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}


2)添加一个特定的子对象,但如果我尝试添加更多的子对象,当我希望嵌套对象变得“更宽”时,它将“更深入”到嵌套对象中。
//This won't work because it is going 'deeper' instead of 'wider'
String id = "1234-4321";
String id2 = "1234-4432";
Query myQuery = myRef.child(id).child(id2);

然后以同样的方式在监听器中循环,但是,我需要为每个聊天室创建一个不同的数据库引用,这非常低效。
看起来解决方案可能是使用filters,但我这辈子都不知道如何在现有的firebasedatabase和databasereference对象中使用它们。有没有人知道如何使过滤器对我在这里列出的数据模式/模型起作用?
谢谢你的帮助!

最佳答案

我将试图向您解释以下示例中过滤的基本用途:
//获取前两个聊天室

Query chatRoomsQuery = databaseReference.limitToLast(2);

//获取最后两个聊天室
Query chatRoomsQuery = databaseReference.limitToFirst(2)

//获取所有活动id
Query chatRoomsQuery = databaseReference.orderByChild("active").equalTo(true);

这只是一个基本的示例,我鼓励您通过this blog。这就惊人地解释了高级查询。
或者,您也可以通过these docs。它们不同于你所分享的。
如果这是你要找的,一定要告诉我。

07-24 18:10
查看更多