java - 按 firebase 中的孙属性过滤 [在 android 中]

标签 java android filter firebase firebase-realtime-database

上下文:

大家好,我目前正在从事一个由 Firebase 支持的 Android 项目。

我已经建立了一个非规范化的数据结构,通过votespolls 关联到users(多对多关系)。这是一张显示我数据库的 votes 路径的图像。结构如下:

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

enter image description here

所以在这个例子中,我们有一个有 4 票的投票。

我想检查一下用户是否已经对民意调查进行了投票。为了做到这一点,我获取了 pollsUid,然后运行它的投票,看看是否有任何投票包含 voterUid 属性 == 到他们的用户 uid。

这是按如下方式完成的:

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 收到的数据快照始终为空(即不存在)。我通过检查数据知道投票存在于数据库中,并且 userUid 通过调试是正确的。删除 equalTolimitToFirst 会毫无问题地返回投票的所有选票,因此很明显 ref 的主干是正确的。这对我来说意味着问题是由刚才提到的两种方法之一造成的。更奇怪的是,这种方法在某些时候确实有效,但在其他时候却无效。

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

进一步说明,我看到人们采用使用查询而不是数据库引用的方法。也许这可能与当前的问题有关。

最佳答案

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

另一种数据库结构是

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

在用户投票后将值设置为该节点。

检查用户是否投票

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

关于java - 按 firebase 中的孙属性过滤 [在 android 中],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38835487/

相关文章:

java - 变量可能尚未在 java 中初始化

java - 如何使用 apache Camel Bindy 将两个 xml 标签合并为一个 xml

Android:屏幕方向改变后 fragment 恢复

list - 在 Scala 中,基于与另一个元素的相似性来删除列表中元素的最有效方法是什么?

java - 在 Java Filter 中获取方法名称

java - 如何在 Java 中定义重复的枚举常量?

java - 不使用 repaint()、revalidate() 刷新 GUI

java - 使用堆栈交换 API

android 模拟器 2.3.3 - 无法通过 adb 启动联系人应用程序

filter - Google Docs 电子表格显示匹配条件的行中的数据