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

Posted

技术标签:

【中文标题】如何在 Firebase 中保存用户分数并在 Android Studio 中实时检索【英文标题】:How to save users score in firebase and retrieve it in real-time in Android studio 【发布时间】:2018-06-26 17:13:39 【问题描述】:

我正在创建一个应用程序,在该应用程序中单击按钮会增加点数,这些点数应保存到 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

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

【问题讨论】:

请发布您的代码以便我们为您提供帮助 请添加您目前已编码的代码。 【参考方案1】:

编辑: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字段是整数类型,解决这个问题,请使用以下方法:

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);

【讨论】:

对不起,我对此很陌生,所以对上面的代码不太了解,请参阅上面我给出的代码 你试过我的代码了吗? Here 您可以找到有关 Firebase 事务的所有信息。试一试,会成功的。 是的,我尝试从我的代码中删除 advalueremoving 方法但不起作用(我添加了您的代码但不知道为什么它不起作用) 没有错误,但 textview 上没有显示任何内容,也没有保存到 firebase 或者我认为我以错误的方式实现它 嘿,我设法用你的代码更新了它正在工作的值,但是当我再次销毁应用程序时再次出现同样的问题,它涉及到初始【参考方案2】:

你需要先获取上一个分数的值,然后将它与当前分数相加,然后更新firebase数据库中的最终值。

question_score.child("score").addValueEventListener(new ValueEventListener() 
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) 
                            String previousScore = dataSnapshot.getValue(String.class);
                            if (previousScore!=null)
                                int finalScore = Integer.parseInt(previousScore) + current_score;
                                question_score.child("score").setValue(String.valueOf(finalScore));
                            
                        

                        @Override
                        public void onCancelled(DatabaseError databaseError) 

                        
                    );

【讨论】:

谢谢,请查看我的代码并告诉我一些以正确方式实现的想法,您提供的代码对我不起作用或者我认为我做错了什么【参考方案3】:

我认为以前的分数是你代码中的一个字符串@DHANANJAY KUMAR 并且不能添加字符串以及String.class 的含义。我觉得是可以的

int previousScore = dataSnapshot.getValue(Integer.class);

如果我们可以编辑

String.class

Integer.class

int.class

请说明

【讨论】:

以上是关于如何在 Firebase 中保存用户分数并在 Android Studio 中实时检索的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个事务中将图像上传到 Firebase 存储并在数据库中保存参考?

如何将文件共享首选项值保存到firebase并检索它

如何使用 Firebase 身份验证服务并在我们自己的数据库中拥有用户?

如何在 Firebase 上保存图像 [重复]

如何在 Android 设备上保存 Firebase 通知?

如何在没有 Geofire 的情况下将位置对象保存在 Firebase 中?