读取数据,然后更新并保存

时间:2020-02-29 23:48:19

标签: java android firebase-realtime-database

我需要您帮助我解决这个问题:


问题是我想从Firebase数据库中读取名为public class AsyncSemaphorePlus { private readonly object _locker = new object(); private readonly Queue<(TaskCompletionSource<bool>, int)> _queue = new Queue<(TaskCompletionSource<bool>, int)>(); private int _currentCount; public int CurrentCount { get { lock (_locker) return _currentCount; } } public AsyncSemaphorePlus(int initialCount) { if (initialCount < 0) throw new ArgumentOutOfRangeException(nameof(initialCount)); _currentCount = initialCount; } public Task WaitAsync(int count) { lock (_locker) { if (_currentCount - count >= 0) { _currentCount -= count; return Task.CompletedTask; } else { var tcs = new TaskCompletionSource<bool>( TaskCreationOptions.RunContinuationsAsynchronously); _queue.Enqueue((tcs, count)); return tcs.Task; } } } public void Release(int count) { lock (_locker) { _currentCount += count; while (_queue.Count > 0) { var (tcs, weight) = _queue.Peek(); if (weight > _currentCount) break; (tcs, weight) = _queue.Dequeue(); _currentCount -= weight; tcs.SetResult(true); } } } } 的{​​{1}},然后将其转换为Post值。然后,当我按下一个按钮时,我想将1加到硬币,然后,我将其变回String值以保存到数据库中。

所以我尝试通过使用coins来读取数据,然后使用
Integer将其转换为名为score的String值。

之后,我使用onDataChange将1加到整数上,但是Android Studio告诉我:

无法解决分数

我不知道该如何解决这个问题,所以如果您能帮助我解决这个问题,我将非常高兴。

这是我的代码:

int score = Integer.parseInt(coins)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是一个基本的范围界定问题:变量仅存在于声明它们的范围内。

因此,您在int score中声明的onDataChangeonClick方法中不再可用。

并且您在Integer score中声明的onClick是一个新变量,这意味着Integer score = score + 1;将不起作用,因为右侧的score不存在/没有值。

解决方案是将score声明为更高一级,作为``类的成员字段:

Integer score = -1;

Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()){
            String coins = ""+ds.child("coins").getValue();

            score = Integer.parseInt(coins);

            coinsTv.setText(score);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});

addCoinsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference coinsRef = database.getReference("Users/"+ user.getUid() +"/coins");

        score = score + 1;
        String scorefinal = Integer.toString(score);
        coinsRef.setValue(scorefinal);
    }
});

我强烈建议您将值作为数字存储在数据库中,因为它可以节省您不断地从字符串转换为整数然后返回的情况。如果执行此操作,则上面的代码将变为:

Integer score = -1;

Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()){
            score = ds.child("coins").getValue(Integer.class);
            coinsTv.setText(score);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});

addCoinsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference coinsRef = database.getReference("Users/"+ user.getUid() +"/coins");
        coinsRef.setValue(score+1);
    }
});