gpt4 book ai didi

android - 在 Firebase 上使用事务

转载 作者:行者123 更新时间:2023-11-30 00:10:25 24 4
gpt4 key购买 nike

我的 Firebase 项目有问题。我正在尝试向其添加一个 react 按钮,所以我所做的是每次用户按下喜欢/喜欢按钮时,以“ReactingUser”作为节点的 firebase 节点,它会将用户 ID 添加为键,将“1”添加为值。此外,帖子上的总 react 数由“TotalReactions”节点表示,该节点将计算“ReactingUser”的子节点总数并相应地设置值。我的问题是,如果两个用户同时按下它会怎样,我知道这会导致碰撞并且我可能会遇到问题,因为我的数据取决于那个“TotalReactions”节点。谁能告诉我如何在我的数据库上使用事务以避免冲突问题?我尝试浏览其他教程,但没有一个能让我明白。这是我的 react 按钮代码的样子:

reactionUserDatabase.child(uniqueKey).child("ReactingUser").child(currentUserID).setValue("1").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
reactionUserDatabase.child(uniqueKey).child("ReactingUser").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String totalVotes = String.valueOf(dataSnapshot.getChildrenCount());
reactionUserDatabase.child(uniqueKey).child("TotalReactions").setValue(totalVotes).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {

} else {
Toast.makeText(context, "Some Error Occured", Toast.LENGTH_LONG).show();
}
}
});
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

现在如何实现数据交易以防止冲突?还是我做得很好,它不会影响?

最佳答案

这是您可以使用事务的方式:

reactionUserDatabase.child(uniqueKey).child("ReactingUser").child(currentUserID).runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
String stringTotalVotes = mutableData.getValue(String.class);
int totalVotes = Integer.valueOf(stringTotalVotes);

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

if (totalVotes != null) {
totalVotes = totalVotes - 1;
} else {
totalVotes = totalVotes + 1;
}

mutableData.setValue(String.valueOf(totalVotes));
return Transaction.success(mutableData);
}

@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});

如您所见,此代码使用了 String 类,但我强烈建议您将 currentUserID 字段的值设置为 int 而不是字符串。

关于android - 在 Firebase 上使用事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com