我的Firebase数据库中有一些(有些)大量的笑话,如下图所示。
我将它们显示在我的Android应用中的列表中,类似于Feed。我还实现了使用Firebase身份验证登录的可能性,现在我想为已登录的用户添加选项(如)笑话并将其添加到收藏夹(收藏夹应该像私人书签一样)。我正在徘徊如何构建我的数据,我有两个提议:
添加名为“userJokes”的新根节点,其中子节点表示来自Firebase身份验证的用户UID。每个UID子节点都应该拥有来自“笑话”节点的每个笑话的副本,以及代表(dis)喜欢和喜欢的状态的其他布尔值。
另一个解决方案是将每个用户UID添加到用户(dis)喜欢或添加到收藏夹的笑话中。
第一种解决方案是合乎逻辑的,但如果以这种方式构建数据,我怎么能算出喜欢和不喜欢的数量?对于要在Feed中显示的每个用户,将每个笑话从“笑话”节点复制到“userJokes”节点的最佳方法是什么?第二个是不切实际的,因为在检索笑话时,我会得到有关(dis)喜欢或添加到收藏夹的每个用户的信息,这不是我需要的。哪种解决方案更好?还有别的吗?可以将Firebase身份验证中的用户UID添加到Firebase数据库中的数据库吗?
答案 0 :(得分:1)
我认为第一个更受欢迎,虽然它需要一些调整:)
首先注意:如果您创建的数据仅用作关系(例如userJokes
),那么只需向其添加简单值而不复制整个源数据(jokes
数据),如下所示:
userJokes: {
randomUserId: {
randomJokeId:true,
anotherRandomJokeId:true
}
awesomeUser: {
randomJokeId:true
}
}
第二个注释:如果你想实现两个功能(喜欢和喜欢),我认为你应该把它作为不同的数据。所以它会是userJokeLike
和userJokeFavorite
(或类似的东西)。并且每个结构的结构应该与我在第一个注释中提到的相同。
总结:
每个笑话数据仍在其源路径中(即jokes
内)并且只将其ID复制到新创建的数据路径(userJokeLike
和userJokeFavorite
)
如果您想搜索ID为randomUserId
的用户喜欢的笑话,您应该检查userJokeLike\randomUserId
。然后从你到达的每个笑话ID中,从源jokes
路径中获取真实数据。
如果您想搜索ID为randomUserId
的用户所青睐的笑话,基本上,请执行与上述相同的操作。
当你想要计算每个笑话的喜欢和喜欢时,只需使用以下内容:
FirebaseDatabase.getInstance().getReference("userJokeLike")
.orderByChild().equalsTo("randomJokeId")
.addListenerForSingleValueEvent(new ValueEventListener() {
... onDataChange(DataSnapshot dataSnapshot) {
int jokeCount = dataSnapshot.getChildrenCount();
}
});
你去了,希望这有帮助。
注意:我还没有检查最后一个代码,希望工作:p
修改强>
看起来我确实误解了:D
上面的解决方案是我认为最适合结构本身的解决方案。但是,如果我们需要一些简单而快速的东西,那么每种情况/情况都会有所不同。我认为这是最好的解决方案,如果你想包括喜欢和收藏夹的笑话(不需要创建另一个请求),那么你的结构应该是这样的:
jokes: {
randomJokeId: {
// joke data here
likes:{
randomUserId:true,
anotherUserId:true
},
favorites:{
randomUserId:true
}
}
}
当您请求likes
数据时,它会包含favorite
和jokes
。因此,您需要检查每个数据中的likes
和/或favorite
内是否存在当前用户的UID。而这样的计数器会更容易。
快乐编码:)