【问题标题】:Persistent Firebase Database持久性 Firebase 数据库
【发布时间】:2017-02-03 18:09:57
【问题描述】:

我正在制作一个投票应用程序。有两个按钮,点击次数存储在 Firebase 数据库中。但是,在关闭应用程序(杀死应用程序进程)时,数据库会刷新并且计数器再次从零开始。即使在应用程序被杀死后,数据库是否可以从它离开的地方开始计数。

MainActivity.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() { }

}

谢谢

【问题讨论】:

  • 发布你的代码,否则我会因为发布不完整的问题而投反对票!
  • @OBX 源代码贴出!
  • 您需要从 Firebase 获取当前投票数并将您的计数器变量设置为该值。为此,我会在回调中为您的按钮设置OnClickListener,以避免在检索数据之前覆盖数据
  • @AndrewBrooke 您能否显示检索 Firebase 数据库的代码。谢谢

标签: android firebase firebase-realtime-database


【解决方案1】:

Counter 和 counter1 是局部变量,您没有持久化它们。当您将 counter 和 counter1 的值存储到数据库时,您应该简单地检索该值并将其递增 1。

mRefChild.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // you can retrieve your stored value from dataSnapshot 
            Object data = dataSnapshot.getValue()
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

听起来您正在使用 Firebase 的订购版本。请参考此链接https://firebase.google.com/support/guides/firebase-android 并升级您的项目。

上面的链接还提供了有关读取数据的详细信息。在你的情况下 addListenerForSingleValueEvent(..) 将解决你的问题。

https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html

从您的代码中,听起来您直接为 Votes 存储价值,并且没有表结构或任何东西。所以 dataSnapshot.getValue() 应该返回你的值。但是,我建议您调试代码并放置断点 Object data = dataSnapshot.getValue() 并分析 dataSnapshot 实例中的信息。都在那里。

一旦您检索到该值,请将其分配给 counter 或 counter1 变量。因此,每次您启动应用程序时,您都会将投票值更新回您的变量。您已经在单击按钮时进行了 counter++,因此应该可以按原样工作。

【讨论】:

  • 我收到无法解析方法“getValue()”错误。如何解决此错误?
  • 请解释在 onDataChange 中放置什么,以便在单击按钮时读取子项中的值并进行增量。
  • 一旦你的问题得到解决,别忘了接受答案。
  • 我的值加1其实有问题,请解释一下如何将值加1。
  • 非常感谢!我已经使用 Firebase 事务完成了。
猜你喜欢
  • 1970-01-01
  • 2016-10-19
  • 2018-12-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2020-05-31
相关资源
最近更新 更多