【问题标题】:Firebase - get elements by list of IDsFirebase - 通过 ID 列表获取元素
【发布时间】:2016-03-12 21:53:08
【问题描述】:

我使用 firebase 作为我的数据库后端,并且有一个多对多的关系。 由于我的关系有点抽象,我将在这里举一个简化的例子。假设我们有学生和讲座。学生可以参加讲座,讲座有参加学生的名单。在整个应用程序中,两个查询都需要,因此将列表保存在其中任何一个中都没有真正的优势。这个问题在像这样的 No-SQL 场景中似乎并不少见,我什至读过关于存储每个学生的所有讲座列表和每个讲座的学生列表,这是一个有效的解决方案。 假设我的 JSON 数据如下所示:

"students": {
    "s1" : {
        "name": "A",
        "lectures": ["l1", "l2"]
    },
    "s2" : {
        "name": "B",
        "lectures": ["l2", "l3"]
    }

}

"lectures": {
    "l1" : {
        "title": "lecture1",
        "students": ["s1"]
    },
    "l2" : {
        "title": "lecture2",
        "students": ["s1", "s2"]
    },
    "l3" : {
        "title": "lecture3",
        "students": ["s2"]
    }
}

其中 s1、s2、l1、l2、l3 是神秘的 Firebase ID。 使用这样的设置,很容易编写一个查询,以便将学生 "s1" 的所有讲座作为数组 ["l1", "l2"] 获取。

但是,我不知道如何使用这组 ID 获取相应的讲座元素,因为我只能查询一个 ID。 我还想避免使用 Java-Code 获取所有数据并在之后对其进行过滤。

【问题讨论】:

    标签: android firebase firebase-realtime-database nosql


    【解决方案1】:

    这样就可以了:

    Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/35963762");
    ref.child("students/s1/lectures").addListenerForSingleValueEvent(new ValueEventListener() {
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot lessonKey: snapshot.getChildren()) {
                ref.child("lectures").child(lessonKey.getValue(String.class)).addListenerForSingleValueEvent(new ValueEventListener() {
                    public void onDataChange(DataSnapshot lectureSnapshot) {
                        System.out.println(lectureSnapshot.child("title").getValue());
                    }
                    public void onCancelled(FirebaseError firebaseError) {
                    }
                });
            }
        }
        public void onCancelled(FirebaseError firebaseError) {
        }
    });
    

    输出:

    讲座1

    讲座2

    关于你的数据结构的一些评论:

    • 您正在嵌套可能不应该嵌套的数据结构。例如,此代码现在还加载了不需要的讲座 1 和讲座 2 的 students 列表。如果将“students in a Lecture”和“lectures for a student”移动到它们自己的顶级节点中,就不会出现这个问题。

    • 您将“讲座中的学生”存储在一个数组中。这意味着如果您从数组中间删除一个讲座,您将不得不更新它之后的所有讲座。更常见的方法是将 Lecture id 存储为键,并将虚拟 true 存储为值:

      students_per_lecture: {
        "l2" : {
          "s1": true, 
          "s2": true
        }
      },
      

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 2011-08-03
      • 2015-09-02
      • 2011-02-23
      • 2012-07-20
      • 2011-07-17
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多