gpt4 book ai didi

android - 如何在firebase中保存用户分数并在Android studio中实时检索

转载 作者:行者123 更新时间:2023-12-05 00:12:39 24 4
gpt4 key购买 nike

我正在创建一个应用程序,其中点击按钮会增加点数,这些点数应该保存到 firebase。我设法将这些数据保存到 firebase。但是当我销毁我的应用程序并再次打开它时,点值显示相同但在单击按钮之后。它再次从 0 开始。

例如:每次点击按钮,积分值增加到 10 分。现在,当我完全销毁应用程序并再次打开它时,点值显示相同,但​​是当再次单击按钮时,它从初始状态开始。

这是我的代码

    int amount = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);

button_claim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
amount = amount + 100;


textView_points.setText(String.valueOf(amount));
databaseReference.setValue(textView_points.getText().toString());

}
});


}


@Override
protected void onStart() {
super.onStart();
if (mAuth.getCurrentUser() == null) {
finish();
Intent main = new Intent(this,MainActivity.class);
main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(main);
}

databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

textView_points.setText(dataSnapshot.getValue(String.class));
databaseReference.setValue(textView_points.getText().toString());
}

@Override
public void onCancelled(DatabaseError databaseError) {

Toast.makeText(Main2Activity.this,"error",Toast.LENGTH_LONG).show();
}
});



}

销毁应用程序之前 see the image please, points increasing on button click before destroying the app and uploading to database请看图 1

再次打开应用程序(关闭后)它显示相同的更新点 please see image 2

现在当我点击声明时它返回到 100 please see image number 3

请帮我解决这个问题,我是新手谢谢

最佳答案

编辑:2020 年 6 月 29 日

现在也可以在不使用事务的情况下解决这个问题。我们可以简单地增加一个值使用:

rootRef.child("score").setValue(ServerValue.increment(1));

对于decremenet,需要下面这行代码:

rootRef.child("score").setValue(ServerValue.increment(-1));

这就是您在 Firebase 数据库中设置值的方式:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("score").setValue(1);

假设你的score字段是Integer类型,要解决这个问题,请使用下面的方法:

public static void setScore(String operation) {
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
scoreRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Integer score = mutableData.getValue(Integer.class);
if (score == null) {
return Transaction.success(mutableData);
}

if (operation.equals("increaseScore")) {
mutableData.setValue(score + 1);
} else if (operation.equals("decreaseScore")){
mutableData.setValue(score - 1);
}

return Transaction.success(mutableData);
}

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

为此,我建议您一定要使用transactions。如果用户试图同时增加/减少分数,您将避免错误的结果。因此,作为结论,根据您的增/减操作调用此方法。

阅读方式如下:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Integer score = ds.getValue(Integer.class);
Log.d("TAG", score + "");
}

@Override
public void onCancelled(DatabaseError databaseError) {}
};
scoreRef.addListenerForSingleValueEvent(eventListener);

关于android - 如何在firebase中保存用户分数并在Android studio中实时检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307610/

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