通过firebase中的孙子属性过滤[在android]

时间:2016-08-08 17:45:16

标签: java android filter firebase firebase-realtime-database

背景:

嗨,我目前正在开发一个由Firebase支持的Android项目。

我已经设置了一个非规范化的数据结构,通过polls的方式将usersvotes(多对多关系)联系起来。这是显示数据库votes路径的图像。结构如下:

投票 - > [pollUid] - > [votePushuid] - >投票对象

enter image description here

所以在这个例子中我们有一个有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通过调试是正确的。删除equalTolimitToFirst会返回投票的所有投票而没有问题,因此参考的词干是正确的。这对我来说意味着问题是由刚刚提到的两种方法之一产生的。更奇怪的是,这种方法在某些时候确实有效,但在其他时候却没有。

问题: 如何返回由孙子属性过滤的firebase存储对象列表?如果这不可能,那么这个问题的数据结构会更合适吗?

进一步说明,我看到人们采用Query而不是Databasereferences的方法。也许这可能与当前的问题有关。

1 个答案:

答案 0 :(得分:1)

您的查询是正确的。使用我自己的数据库运行该查询没有问题。 userId可能不匹配。 DatabaseReference扩展了Query,这就是您可以访问查询方法的原因。

数据库结构替代方案

{ "users_votes": {
        "<userId>": {
            "<pollId1>" : true,
            "<pollId2>" : true,
            "<pollId3>" : true
        }
    }
}

一旦用户投票支持投票,就将值设置为该节点。

检查用户是否投票赞成

usersVotesRef.child(FirebaseHandler.getInstance().getUserUid())
    .child(pollKey).addListenerForSingleValueEvent(valueEventListener);