背景:
嗨,我目前正在开发一个由Firebase支持的Android项目。
我已经设置了一个非规范化的数据结构,通过polls
的方式将users
与votes
(多对多关系)联系起来。这是显示数据库votes
路径的图像。结构如下:
投票 - > [pollUid] - > [votePushuid] - >投票对象
所以在这个例子中我们有一个有4票的民意调查。
我想检查用户是否已投票进行投票。为了做到这一点,我获取pollsUid,然后运行其投票,以查看它们中是否有任何包含对其用户uid的voterUid属性==。
这样做如下:
FirebaseHandler.getInstance().getMainDatabaseRef()
.child(FirebaseConstants.VOTES) //votes root
.child(pollKey) //polluid
.orderByChild("voterUid")
.equalTo(FirebaseHandler.getInstance().getUserUid())
.limitToFirst(1)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
如果datasnaptshot存在,那么我们知道用户已经对此轮询进行了投票,并且可以在Java逻辑中处理它。
问题:
在搜索特定用户对特定民意调查的投票时,onDataChange
收到的数据快照始终为空(即不存在)。我知道一个事实,即通过检查数据在db中存在投票,并且userUid通过调试是正确的。删除equalTo
和limitToFirst
会返回投票的所有投票而没有问题,因此参考的词干是正确的。这对我来说意味着问题是由刚刚提到的两种方法之一产生的。更奇怪的是,这种方法在某些时候确实有效,但在其他时候却没有。
问题: 如何返回由孙子属性过滤的firebase存储对象列表?如果这不可能,那么这个问题的数据结构会更合适吗?
进一步说明,我看到人们采用Query而不是Databasereferences的方法。也许这可能与当前的问题有关。
答案 0 :(得分:1)
您的查询是正确的。使用我自己的数据库运行该查询没有问题。 userId
可能不匹配。 DatabaseReference扩展了Query,这就是您可以访问查询方法的原因。
数据库结构替代方案
{ "users_votes": {
"<userId>": {
"<pollId1>" : true,
"<pollId2>" : true,
"<pollId3>" : true
}
}
}
一旦用户投票支持投票,就将值设置为该节点。
检查用户是否投票赞成
usersVotesRef.child(FirebaseHandler.getInstance().getUserUid())
.child(pollKey).addListenerForSingleValueEvent(valueEventListener);