如何在 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 身份验证服务并在我们自己的数据库中拥有用户?