在我的火基实时数据库中有以下结构:
- PaintingID2
- copies
- price- ...
- PaintingIDX
- copies
- price现在我想听听特定的油漆I和特定的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) {
}谢谢你的想法!
发布于 2021-01-11 16:31:39
似乎在单个根节点下嵌套了多种不同类型的数据,结构化数据上的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。
有关这方面的更多信息,请参见我对Firebase中的多到多关系的回答。
关于第二个问题(今后不要在一个帖子中提出多个问题):倾听节点子集的唯一方法是通过查询。因此,例如,如果您想要听所有的绘画的特定价格,您将执行一个查询的价格。
如果你想听某位艺术家的所有作品,你的选择是:
/ArtistPaintings中获取艺术家的画图ID,然后为每幅画使用一个单独的侦听器。这几乎不像您想象的那样缓慢/资源密集型,就像Firebase 将请求传输到单个套接字上那样。要了解有关NoSQL数据建模的更多信息,尤其是Firebase,请阅读NoSQL数据建模、watch SQL开发人员的防火墙和可能的了解云修复 (后者适用于Cloud,但许多机制也适用于实时数据库)。
https://stackoverflow.com/questions/65663123
复制相似问题