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

Has*_*ash 2 android firebase firebase-realtime-database

我正在创建一个应用程序,其中单击按钮时点会增加,并且这些点应保存到 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();
        }
    });



    }
Run Code Online (Sandbox Code Playgroud)

在销毁应用程序之前 请查看图片,在销毁应用程序并上传到数据库之前单击按钮增加点数 请参见图片1

再次打开应用程序(关闭后)它显示相同的更新点, 请参见图 2

现在,当我单击声明时,它会返回到 100, 请参见图片编号 3

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

Ale*_*amo 5

编辑:2020 年 6 月 29 日

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

rootRef.child("score").setValue(ServerValue.increment(1));
Run Code Online (Sandbox Code Playgroud)

对于 decremenet,需要以下代码行:

rootRef.child("score").setValue(ServerValue.increment(-1));
Run Code Online (Sandbox Code Playgroud)

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("score").setValue(1);
Run Code Online (Sandbox Code Playgroud)

假设你的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) {}
    });
}
Run Code Online (Sandbox Code Playgroud)

为此,我建议您绝对使用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);
Run Code Online (Sandbox Code Playgroud)