如何在Google Firebase数据库中使用过滤器和子元素

时间:2016-09-27 22:57:31

标签: android firebase firebase-realtime-database

使用新的Firebase数据库框架处理Android应用。它具有如下建模的数据对象: enter image description here 在顶级父母(1234-4321)是聊天室的情况下,数据对象是'聊天消息'并且编号的项目(0,1,2)是& #39;个人信息'。

我能够毫无困难地获取整个数据库,并通过听众阅读:

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

但我不能为我的生活弄清楚如何获得相同类型的多个对象。我的意思是,用户将能够获得多个聊天室(IE,1239-4321'和#12; 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);

然后以相同的方式在侦听器中循环,但是,我需要为每个聊天室创建一个不同的DatabaseReference,这非常低效。

看起来解决方案可能是使用filters,但我不能在我的生活中弄清楚如何在现有的FirebaseDatabase和DatabaseReference对象中使用它们。有没有人知道如何使过滤器工作与我在这里列出的数据模式/模型有关?

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

我会尝试在这些例子中向您解释过滤的基本用法:

//获得前两个聊天室 s

Query chatRoomsQuery = databaseReference.limitToLast(2);

//获取最后两个聊天室

Query chatRoomsQuery = databaseReference.limitToFirst(2)

//获取所有有效ID

Query chatRoomsQuery = databaseReference.orderByChild("active").equalTo(true);

这只是一个基本的示例,我鼓励您完成this blog。这惊人地解释了高级查询。

或者,您也可以浏览these docs。它们与您分享的不同。

请告诉我这是否是您要找的。