尝试为likes
Firebase节点中不存在ID的电影加星标时,我遇到了问题。这是我的代码:
private void onStarClicked(long releaseId, final String uid) {
final DatabaseReference postRef = ((GamePageActivity)getActivity()).mDatabaseRef.child("likes").child(mRegion).child(String.valueOf(releaseId));
postRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
_Post p = mutableData.getValue(_Post.class);
if (p == null) {
Log.d(TAG, "Transaction success");
return Transaction.success(mutableData);
}
if (p.stars.containsKey(uid)) {
// Unstar the post and remove self from stars
p.starCount = p.starCount - 1;
p.stars.remove(uid);
} else {
// Star the post and add self to stars
p.starCount = p.starCount + 1;
p.stars.put(uid, true);
}
// Set value and report transaction success
mutableData.setValue(p);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
}
问题是如果数据库中不存在我的id“ releaseId”,不会添加星号,我认为我的代码应该首先添加“ releaseId”(如果不存在)? / p>
答案 0 :(得分:0)
在“喜欢”交易期间尝试在喜欢路径中添加电影似乎有点复杂。理想情况下,它将已经存在。因此,将影片单独添加到点赞路径更容易,然后使用Cloud Function onCreate或onUpdate。
我假设您的电影数据在数据库中的其他位置。现在将其称为“电影”路径。可以尝试的一种方法是使用Cloud Function来监视您的“电影”路径,并且在添加电影后,该功能会将电影数据添加到您的“喜欢”路径中。这样,一旦用户尝试喜欢电影,其信息就已经在数据库中的正确位置。解决了不存在的“ releaseId”的问题。
Firebase Realtime Database Triggers
如果您不想使用Cloud Function,则可以考虑在添加电影时直接从客户端写入“电影”路径和“喜欢”路径,以完成相同的工作。