我想定义云公司的FireStore这两个集合。一些样品的数据已被显示如下:
播放列表:
歌曲:
playlistId: “playlist1”
标题: “song2”
playlistId: “playlist1”
标题: “song3”
此外,在我的Android应用程序,我想告诉所有的播放列表,所有歌曲的单独列表。然而,虽然显示了所有播放列表的列表,我要显示的每个播放列表非常久远的包含在每个歌曲的编号的名称,基于在“songCount”的值。
请指教排序查询我需要在云公司的FireStore使实现这一目标的。是否有JOIN
功能可用或我将不得不把歌曲集合在一个循环和计数有playlistId为“playlist1”的那些,然后重复它为所有在播放列表中被呈现的播放列表?我想有一个聪明的解决方案,但无法找到一个在互联网上。
任何帮助将是一个很大的帮助。谢谢你的时间。
是否有加入的功能是否可用?
不幸的是,没有JOIN
在公司的FireStore查询。在公司的FireStore查询是浅:他们只从该查询针对运行采集得到的物品。有没有办法让从顶级集合和其他集合或子集的文档在一个单一的查询。公司的FireStore不支持一气呵成跨越不同的集合查询。单个查询可能只在单个集合使用的文件的属性。因此最简单的解决方案,我能想到的,是使用一个数据库结构类似这个样子:
Firestore-root
|
--- playlists (collection)
| |
| --- playListId (document) //The unique id of the play list
| |
| --- name: "playlist1"
|
--- songs (collection)
|
--- playListId (document) //The same as the above playListId
|
--- playListSongs
|
--- songId
|
--- title: "song1"
为了显示所有播放列表,只是附加一个侦听的playlists
参考,并得到所有playlist
对象。如果你想获得的所有歌曲,对应于特定的播放列表,只是附加一个侦听songs\playListId\playListSongs
,并得到所有song
对象。
对于所有歌曲的数量对应于一个播放列表,我建议你看看我的回答从这个职位,在那里我已经解释了,你可以做到这一点。所以,根据我的回答的最后一部分,你的火力地堡实时数据库结构应该是这样的:
Firebase-Realtime-Database-root
|
--- playlists
|
--- playListIdOne: numberOfSongs
|
--- playListIdTwo: numberOfSongs
编辑:
我不能说,因为第一个答案涉及公司的FireStore和第二个涉及火力地堡实时数据库,我的理解是完全特别。
我给你这个解决方案,因为如果你想使用云计算公司的FireStore计算和更新的元素每次一首歌曲被添加或删除,你会被公司的FireStore为每个写入/删除操作进行充电。火力地堡实时数据库还有一个定价计划,所以你不会被收取了点。查看公司的FireStore定价请直到结束时再次读取,从此我的答案后。
另外,我也没有真正得到的程序计算的歌曲数量。
这是你如何可以从公司的FireStore获得的歌曲数量,并将其写入到火力地堡实时数据库:
rootRef.collection("songs").document(playListId).collection("playListSongs")
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
Log.d("TAG", task.getResult().size() + "");
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playListIdRef = rootRef.child("playlists").child(playListId);
playListIdRef.setValue(task.getResult().size());
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
这是你可以阅读:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playListIdRef = rootRef.child("playlists").child(playListId);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long playListIdOne = dataSnapshot.getValue(String.Long);
Log.d(TAG, "playListIdOne: " + playListIdOne);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
playListIdRef.addListenerForSingleValueEvent(valueEventListener);
其次,按您的建议的结构,我将如何得到所有歌曲的所有播放列表?
在这种情况下,你应该创建另外一个集合,命名allSongs
。在你的数据库附加征收应该是这样的:
Firestore-root
|
--- allSongs
|
--- songId
|
--- //song details
这种做法被称为denormalization
是一种常见的做法,当涉及到火力地堡。为了更好地理解,我建议你看到这段视频,非规范化是正常的与火力地堡数据库。它是火力地堡实时数据库中,但规则同样适用于云计算公司的FireStore。
同样,当你重复的数据,有一件事,你需要牢记。在您添加数据以同样的方式,你需要保持它。换句话说,如果你想更新/删除一个项目,你需要做的是在每一个地方,它的存在。
记住一个相同的歌曲可以在多个播放列表中找到。
不要紧,因为每首歌都有不同的ID。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句