0

Firebase 数据库

正如您在屏幕截图中看到的那样,我无法在 /user_events/{uid}/{eventId} 中更新 /upvoters/。/events/{uid} 是从客户端更新的,它可以工作。当我尝试 console.log 调试我的云功能代码时,我意识到 events.data.val() 返回的不是更新的而是以前的值 /upvoters/ ,但它接收“评级”的当前值。以下是我的客户端和云代码。

编辑: vote() 更新events/{eventId}和云函数将相同的值复制到/user_events/{uid}/{eventId}. 我不明白 vote() 是如何无用的。我想要做的是更新user_events当我events{eventId}用 vote() 更新它并且它确实更新除了/upvoters/. 所以基本上发生的事情是;当 vote() 第一次执行/events/upvoters/是用 vote() 创建的,exports.set_user_events将整个事件设置为/user_events/{eventId}/upvoters/运行良好。当 vote() 第二次运行时,我删除了 upvoters 地图中的 upvoter,events/{eventId}/然后更新了我的云功能,我已经使用 console.log 命令对其进行了调试,并且看到此时event.data.val()返回就好像没有删除 upvoters但其他值(例如评级)是更新值。所以user_events/{uid}/{eventId}/更新除了它的支持者孩子。

云代码:

// Add an event to user_events
exports.set_user_events = functions.database.ref('social/events/{pushId}')
    .onWrite((event) => {
        const original = event.data.val();
        console.log('testValue',original);
        return admin.database().ref('social/user_events/' + original.owner.uid + "/" + event.params.pushId).set(original);
    });

安卓代码:

  void vote(String eventId) {
        final DatabaseReference eventRef = rootRef.child("events").child(eventId);
        eventRef.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(MutableData mutableData) {
                Event e = mutableData.getValue(Event.class);

                if (e == null) {
                    return Transaction.success(mutableData);
                }

                if(e.upvoters!=null) {
                    if(!e.upvoters.containsKey(currentUser.getUid())) {
                        e.upvoters.put(currentUser.getUid(),true);
                        e. rating = e.rating + 1;
                    }
                    else {
                        e.upvoters.remove(currentUser.getUid());
                        e.rating = e.rating - 1;

                    }
                }
                else {
                    Map<String,Boolean> upvoters = new HashMap<>();
                    upvoters.put(currentUser.getUid(),true);
                    e.rating = e.rating + 1;
                    e.upvoters = upvoters;
                }

                mutableData.setValue(e);
                return Transaction.success(mutableData);
            }

            @Override
            public void onComplete(DatabaseError databaseError, boolean b,
                                   DataSnapshot dataSnapshot) {

            }
        });
    }
4

0 回答 0