Android Firebase数据库中的读写值问题
我想从Firebase中读取2个值(如果第一个用户不存在),如果需要,则更新它们。事实上,我一开始试着用一个值去做,但没有运气。我的代码是Android Firebase数据库中的读写值问题,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想从Firebase中读取2个值(如果第一个用户不存在),如果需要,则更新它们。事实上,我一开始试着用一个值去做,但没有运气。我的代码是 mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
final String uid = Objects.requireNonNull( mAuth.getCurrentUser() ).getUid();
mScoreReference.child( uid ).addListenerForSingleValueEvent( new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User oldscore = dataSnapshot.getValue( User.class );
if (dataSnapshot.exists()) {
if(oldscore.getScore()==null){
oldscore.setScore(String.valueOf( 0));
String oldscorevalue = Objects.requireNonNull(oldscore).getScore();
int convertedscore = Integer.parseInt(oldscorevalue);
if (convertedscore > 0) {
//Upload points to Database
mScoreReference.child(uid).child( "Score" )
.setValue( convertedscore + newScore );
} else mScoreReference.child(uid).child( "Score" ).setValue( newScore );
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
} );
我设法转换为null(作为score的第一个值不存在)并设置score。所以我的问题是为什么我不能更新这个值,我怎么能同时更新两个值呢?可能我必须使用事务,但我对它一点也不熟悉。我正在阅读,但我找不到如何将此代码转换为事务
更新
我试过交易
mScoreReference.child( uid ).runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
User user = mutableData.getValue(User.class);
if (user.getScore() == null) {
mScoreReference.child(uid).child( "Score" ).setValue( newScore );
}
else{
String oldscorevalue = Objects.requireNonNull(user).getScore();
int convertedscore = Integer.parseInt(oldscorevalue);
mScoreReference.child(uid).child( "Score" )
.setValue( convertedscore + newScore );
}
// Set value and report transaction success
mutableData.setValue(user);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
我有奇怪的结果。第一次什么都不做,然后添加分数和另一个irelavent用户值,然后在数据库中添加两个分数字段。查看如何使用事务@道格·史蒂文森:我正在检查,但我发现更难理解。谢谢你的帮助。