2017-05-21 65 views
1

我已編輯了代碼。有用。它增加了firebase中的計數器。但有一個問題。每當我重新啓動應用程序(清除最近的應用程序後),增量重新開始。它不會從先前的號碼繼續。如何在Firebase中增加號碼

公共類MainActivity擴展AppCompatActivity {

Button bNext; 
long count; 

DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference mCounterRef = mRootRef.child("counter"); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    bNext = (Button) findViewById(R.id.bNext); 

    bNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mCounterRef.setValue(++count); 
     } 
    }); 

} 
} 

this is my database

+0

如果應用程序崩潰,請logcat的添加到您的問題 –

+0

的APK可以建立。安裝並點擊按鈕(b下一步)後,它崩潰。 – java

+1

再一次,添加告訴我們爲什麼應用程序崩潰的logcat –

回答

3

三兩件事需要固定:

  1. count在你的數據庫是一個數字,將被解讀爲Long。您不能直接投射到int。相反,您可以投到long,或者您可以使用兩個強制轉換:int count = (int)(long) ...
  2. 您正在使用後增加運算符。它使用該值在之後添加一個。使用預增量代替。
  3. 傾聽一個變化,否則就會循環,因爲setValue()將再次引起火災的聽衆,並再次等

弗蘭克指出,一個Transaction是更好的方式來安全地修改計數器。

final DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference(); 
    final DatabaseReference mCounterRef = mRootRef.child("counter"); 
    // listen for single change 
    mCounterRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // getValue() returns Long 
      long count = (long) dataSnapshot.child("count").getValue(); 

      System.out.println("count before setValue()=" + count); 

      mCounterRef.child("count").setValue(++count); // <= Change to ++count 

      System.out.println("count after setValue()=" + count); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // throw an error if setValue() is rejected 
      throw databaseError.toException(); 
     } 
    }); 

更新編輯的問題:

你可能需要更新您的安全規則,以允許寫訪問。添加完成監聽器,看看是否setValue()失敗:

mCounterRef.child("count").setValue(++count, new DatabaseReference.CompletionListener() { 
    @Override 
    public void onComplete(DatabaseError databaseError, 
          DatabaseReference databaseReference) { 
     if (databaseError != null) { 
      System.out.println("Error: " + databaseError.getMessage()); 
     } 
    } 
}); 
+0

您好,我已編輯過該問題。但仍然是1個問題。應用程序重啓時增量重啓。任何建議? – java

+0

我更新了我的答案。我只能猜測問題是什麼。當您需要崩潰幫助時,在您的帖子中包含logcat輸出或至少發生崩潰時輸出的異常或錯誤消息是非常重要的。 –