【问题标题】:Firebase realtime database: How to listen to a specific subset of items of a node?Firebase 实时数据库:如何监听节点的特定项目子集?
【发布时间】:2021-04-16 04:12:15
【问题描述】:

我的 firebase 实时数据库中有以下结构:

  • 艺术家
    • 艺术家ID
      • 姓名
      • 绘画列表
        • 绘画ID1
        • 绘画ID2
  • 画作(可以有
    • 绘画ID1
      • 副本
      • 价格
    • 绘画ID2
      • 副本
      • 价格
    • ...
    • 绘画IDX
      • 副本
      • 价格

现在我想监听特定绘画 ID 和特定 ArtistID 的变化。 比如我想听 PaintingID1, PaintingID6, PaintingID7, PaintingID11。

到目前为止我的存储库代码:

override fun observeThisPainting(painting: Painting, receiveDataFromBackendCallback: DataFromBackendCallback<Painting>) {
        this.receiveDataFromBackendCallback = receiveDataFromBackendCallback
        val myRef = database.child("paintings").child(painting.paintingId)
        myRef.addValueEventListener(this)
}

override fun onDataChange(snapshot: DataSnapshot) {
    val painting = snapshot.getValue(Painting::class.java)
    painting?.let { receiveDataFromBackendCallback.onSuccess(it) }
}

override fun onCancelled(error: DatabaseError) {

}
  1. 我的 RTDB 的架构是否正确?在我的第一次尝试中,我将所有画作保存在艺术家 listOfPaintings 中。现在我只在那里为他们保存密钥。
  2. 如何从我的视图模型中侦听特定节点的对象子集? (我知道如何监听绘画节点的所有项目,但我想知道是否有办法监听该节点的特定项目)

感谢您的想法!

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database event-listener


    【解决方案1】:

    您似乎在单个根节点下嵌套了多种不同类型的数据,structuring data 上的 Firebase 文档建议不要这样做。我通常期望三个顶级节点,在这样的 JSON 中:

    Artists: {
      "ArtistId1": { name: "...", otherdata... },
      "ArtistId2": { name: "...", otherdata... }
    },
    ArtistPaintings: {
      "ArtistId1": { 
        "Painting1": true,
        "Painting3": true
      },
      "ArtistId2": { 
        "Painting2": true,
        "Painting4": true
      }
    },
    Paintings: {
      "Painting1": { ... },
      "Painting2": { ... },
      "Painting3": { ... },
      "Painting4": { ... },
    }
    

    通过以上内容,您可以显示所有艺术家姓名的列表,而无需下载所有艺术家的所有绘画 ID。

    然后,当用户选择艺术家时,您可以加载绘画 ID,然后加载该艺术家的绘画。如果有帮助,您可以存储比 true 更有意义的内容,例如绘画的标题或其元数据的子集,以便您无需进一步加载即可显示绘画列表。

    如果您可能还需要查找艺术家的绘画,您通常会添加第四个顶级节点PaintingArtists

    有关更多信息,请参阅我对 Many to Many relationship in Firebase 的回答。


    关于您的第二个问题(以后请不要在一个帖子中提出多个问题):监听节点子集的唯一方法是通过查询。因此,例如,如果您想收听某个价格的所有画作,您需要对价格执行查询。

    如果您想听某位艺术家的所有画作,您的选择是:

    1. 在每幅画中包含艺术家 ID,并使用查询。这种数据重复在使用 NoSQL 数据库时非常常见,因为在应用中实现其他用例时,您通常会修改数据模型。
    2. /ArtistPaintings 获取艺术家的绘画ID,然后为每幅绘画使用单独的侦听器。这并不像 Firebase pipelines the requests over a single socket 那样缓慢/资源密集。

    要了解有关 NoSQL 数据建模的更多信息,特别是 Firebase,请阅读 NoSQL data modeling、观看 Firebase for SQL developers 和可能的 Getting to know Cloud Firestore(后者适用于 Cloud Firestore,但许多机制也适用于实时数据库)。

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多