正在使用新的firebase数据库框架开发android应用程序。它有如下建模的数据对象:
其中,最上面的父项(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。它们不同于你所分享的。
如果这是你要找的,一定要告诉我。