首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firebase实时数据库:如何侦听节点的特定项子集?

Firebase实时数据库:如何侦听节点的特定项子集?
EN

Stack Overflow用户
提问于 2021-01-11 07:53:36
回答 1查看 235关注 0票数 0

在我的火基实时数据库中有以下结构:

  • 艺术家
    • ArtistID
      • 名字
      • listOfPaintings
        • PaintingID1
        • PaintingID2

  • 绘画(可以有 )
    • PaintingID1
      • 副本
      • 价格

代码语言:javascript
运行
复制
- PaintingID2 
    - copies
    - price
代码语言:javascript
运行
复制
- ...
- PaintingIDX 
    - copies
    - price

现在我想听听特定的油漆I和特定的ArtistID的变化。例如,我想听PaintingID1,PaintingID6,PaintingID7,PaintingID11。

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

代码语言:javascript
运行
复制
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. 如何从视图模型中侦听特定节点的对象子集?(我知道如何侦听“绘画”节点的所有项,但我想知道是否有一种方法可以侦听此节点的特定项)

谢谢你的想法!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-11 16:31:39

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

代码语言:javascript
运行
复制
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

有关这方面的更多信息,请参见我对Firebase中的多到多关系的回答。

关于第二个问题(今后不要在一个帖子中提出多个问题):倾听节点子集的唯一方法是通过查询。因此,例如,如果您想要听所有的绘画的特定价格,您将执行一个查询的价格。

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

  1. 在每幅画中包含艺术家ID,并使用查询。这种数据复制在使用NoSQL数据库时非常常见,因为当您在应用程序中实现其他用例时,通常会修改您的数据模型。
  2. /ArtistPaintings中获取艺术家的画图ID,然后为每幅画使用一个单独的侦听器。这几乎不像您想象的那样缓慢/资源密集型,就像Firebase 将请求传输到单个套接字上那样。

要了解有关NoSQL数据建模的更多信息,尤其是Firebase,请阅读NoSQL数据建模、watch SQL开发人员的防火墙和可能的了解云修复 (后者适用于Cloud,但许多机制也适用于实时数据库)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65663123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档