2017-02-03 119 views
0

我正在制作投票应用程序。有两个按钮,点击次数存储在Firebase数据库中。但是,在关闭应用程序(终止应用程序进程)时,数据库会刷新,并且计数器会再次从零开始。即使在应用程序被终止之后,数据库是否有可能从其离开的位置开始计数。持久的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() { } 

} 

感谢

+0

发布您的代码,否则我会投票发布不完整的问题! – OBX

+0

@OBX源代码贴! – Abhi

+0

您需要从Firebase获取当前的投票计数,并将您的计数器变量设置为该值。我会为回调中的按钮设置“OnClickListener”,以避免在检索数据之前对其进行写入 –

回答

1

计数器和C1的源代码中的局部变量,你是不是坚持他们。当你存储的计数器和计数器1到数据库的价值,你应该简单地检索值和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) { 

     } 
    }); 

这听起来像你正在使用火力地堡的顺序版本增加它。请参考此链接https://firebase.google.com/support/guides/firebase-android并升级您的项目。

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

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

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

一旦您检索到该值,将其分配给计数器或counter1变量。所以每次你启动应用程序时,你都会将选票的价值更新回你的变量。你已经在按钮点击做counter ++,所以应该按原样运行。

+0

我得到无法解决方法'getValue()'错误。如何解决这个错误? – Abhi

+0

检查我编辑的答案。 –

+0

请解释在onDataChange中放置什么,以便读取子内的值,并在点击按钮时进行增加和增加。 – Abhi