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

标签 android firebase firebase-realtime-database

正在开发使用新的 Firebase 数据库框架的 Android 应用。它具有如下建模的数据对象: enter image description here Top 父级 (1234-4321) 是“聊天室”,数据对象是“聊天消息”,编号项 (0、1、2) 是“个人消息”。

我能够毫不费力地获取整个数据库并通过监听器读取它:

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

而且我能够以这种方式得到一个 child :

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

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

看起来解决方案可能是使用 filters ,但我终其一生都无法弄清楚如何在现有的 FirebaseDatabase 和 DatabaseReference 对象中利用它们。有谁知道如何根据我在此处列出的数据模式/模型制作过滤器?

感谢您的帮助!

最佳答案

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

//获取前两个聊天室

Query chatRoomsQuery = databaseReference.limitToLast(2);

//获取最后两个聊天室

Query chatRoomsQuery = databaseReference.limitToFirst(2)

//获取所有 Activity id

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

这只是一个基本示例,我鼓励您仔细阅读 this blog .这令人惊讶地解释了高级查询。

或者,您也可以通过 these docs .它们与您分享的不同。

如果这就是您要找的,请告诉我。

关于android - 我如何在 Google Firebase 数据库中使用过滤器和子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39735586/

相关文章:

android - 在 android 中使用 like 和 where 子句进行删除

基于Json文件的Java非重复数组

swift - Firebase:根据用户访问不同部分

firebase - 我将如何授权用户使用 Discord Oauth2.0 在 Web 上进行 Firebase 身份验证

javascript - firebase实时数据库是mongoDb吗?

ios - 火力地堡 : Access the database from URL

java - 为什么 XmlPullParser 不读取 android 上的空字符串

android - 设置 Google Pay 以向用户汇款

java - 如何在 Firebase 中使子级可扩展并为其添加值?