android - 每次我重新启动我的 Android 应用程序时,Firebase 中的投票计数都会重置

标签 android firebase firebase-realtime-database

我正在创建一个投票应用程序。 Firebase 数据库计算按钮的点击次数并显示它。但是在关闭应用程序并重新启动时,点击次数从零开始。即使在应用程序关闭并重新启动后,我如何继续将投票数添加到子节点而不是从零开始投票?

主要 Activity .java

public class Main2Activity extends AppCompatActivity {
private Firebase mRootRef;
private Button mBtn1;
private Button mBtn2;
int counter = 0;
int counter1 = 0;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Firebase.setAndroidContext(this);
mBtn1 = (Button) findViewById(R.id.btn1);
mBtn2 = (Button) findViewById(R.id.btn2);
mBtn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v.equals(mBtn1)) {
            mRootRef = new Firebase("https://voting-cf0fa.firebaseio.com/House/Jupiter/Player 1");
            Firebase mRefChild = mRootRef.child("Votes");
            counter++;
            mRefChild.setValue(counter);
            MediaPlayer click1 =MediaPlayer.create(getApplicationContext(), R.raw.click);
            click1.start();
            mBtn1.setEnabled(false);
            mBtn2.setEnabled(false);
            Timer buttonTimer = new Timer();
            buttonTimer.schedule(new TimerTask() {

                @Override
                public void run() {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            mBtn1.setEnabled(true);
                            mBtn2.setEnabled(true);
                        }
                    });
                }
            }, 5000);
            final AlertDialog.Builder Voted = new AlertDialog.Builder(Main2Activity.this);
            Voted.setTitle("Voted");
            Voted.setMessage("You have cast Your Vote!");
            Voted.setCancelable(false);
            final AlertDialog dlg = Voted.create();
            dlg.show();

            final Timer t = new Timer();
            t.schedule(new TimerTask() {
                @Override
                public void run() {
                    dlg.dismiss();
                    t.cancel();
                }
            }, 5000);
        }

    }
});


mBtn2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRootRef = new Firebase("https://voting-cf0fa.firebaseio.com/House/Jupiter/Player 2");
        if (v.equals(mBtn2)) {
            Firebase mRefChild = mRootRef.child("Votes");
            counter1++;
            mRefChild.setValue(counter1);
            MediaPlayer click2 =MediaPlayer.create(getApplicationContext(), R.raw.click);
            click2.start();
            mBtn2.setEnabled(false);
            mBtn1.setEnabled(false);
            Timer buttonTimer = new Timer();
            buttonTimer.schedule(new TimerTask() {

                @Override
                public void run() {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            mBtn2.setEnabled(true);
                            mBtn1.setEnabled(true);
                        }
                    });
                }
            }, 5000);
            final AlertDialog.Builder Voted = new AlertDialog.Builder(Main2Activity.this);
            Voted.setTitle("Voted");
            Voted.setMessage("You Have cast your Vote");
            Voted.setCancelable(false);
            final AlertDialog dlg = Voted.create();
            dlg.show();

            final Timer t = new Timer();
            t.schedule(new TimerTask() {
                @Override
                public void run() {
                    dlg.dismiss();
                    t.cancel();
                }
            }, 5000);

        }
        }
    });
}
@Override
public void onBackPressed() { }

}

最佳答案

来自 Firebase 文档:

在处理可能被并发更新损坏的复杂数据时使用我们的事务功能

public void incrementCounter() {
firebase.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(final MutableData currentData) {
        if (currentData.getValue() == null) {
            currentData.setValue(1);
        } else {
            currentData.setValue((Long) currentData.getValue() + 1);
        }

        return Transaction.success(currentData);
    }

    @Override
    public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
        if (firebaseError != null) {
            Log.d("Firebase counter increment failed.");
        } else {
            Log.d("Firebase counter increment succeeded.");
        }
    }
});
}

关于android - 每次我重新启动我的 Android 应用程序时,Firebase 中的投票计数都会重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052909/

相关文章:

android - 带类映射器 : No setter/field when using FirebaseListAdapter in Java

java - DatabaseException : Can't convert object of type java. lang.Long 类型(Model.class)

java - Android - 实时数据库多子查询?

javascript - Firebase 自动删除功能在 2 小时后要求删除时以秒为单位删除元素

swift - 我怎样才能得到 [String :Any] dictionary that I got from my firebase database? 中的状态值不是零

android - API 控制台数据已损坏。无法为特定包和生产 key 重新创建客户端 ID

AndroidX RecyclerView行高不会换行

java - 如何调用 javascript 函数并获取它返回的 html 代码,Java,Android

android - Sqlite 返回 : error code = 1, msg = 没有这样的表:client_table

ios - 为什么我的 firebase 数据库不等待更新值