2016-12-13 188 views
1

我需要在Android應用中增加每個用戶的能量值。在Firebase中讀取和寫入數據

這裏是我的數據庫的方案:

"Users" : { 
    "NRPdi5gzbsWoHSfovOtIO8XgFjZ2" : { 
     "Character" : { 
     energyCurrent : 0, 
     energyMax : 100, 
     energyObtain : 20, 
     and other char values.. 
     } 
    } 
} 

我看了,做了一些計算,此代碼寫入數據,但沒有在我的火力地堡數據庫更改。此代碼位於Google App Engine上。沒有例外發送,只是沒有任何反應。

final FirebaseDatabase db = FirebaseDatabase.getInstance(); 
      DatabaseReference ref = db.getReference("Users"); 

      ref.addListenerForSingleValueEvent(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot snapshot) { 
        for (DataSnapshot childSnap : snapshot.getChildren()) { 
         int energyCurrent; 
         int energyMax; 
         int energyObtain; 
         try { 
          energyCurrent = (int) childSnap.child("Character").child("energyCurrent").getValue(); 
          energyMax = (int) childSnap.child("Character").child("energyMax").getValue(); 
          energyObtain = (int) childSnap.child("Character").child("energyObtain").getValue(); 
         } 
         catch (Exception e) 
         { 
          continue; 
         } 

         float finalEnergy = energyCurrent + (energyMax * (energyObtain/100)); 
         if (finalEnergy > energyMax){ 
          DatabaseReference reference = childSnap.getRef().child("Character").child("energyCurrent"); 
          reference.setValue(energyMax, new DatabaseReference.CompletionListener() { 
          public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
           throw databaseError.toException(); 
          } 
         }); 
         } 
         else 
         { 
          DatabaseReference reference = childSnap.getRef().child("Character").child("energyCurrent"); 
          reference.setValue((int)finalEnergy, new DatabaseReference.CompletionListener() { 
          public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
           throw databaseError.toException(); 
          } 
         }); 
         } 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        throw databaseError.toException(); 
       } 
      }); 
+0

是否使用管理SDK?您是否創建了服務帳戶並將其用於[驗證您的服務器](https://firebase.google.com/docs/database/admin/start#admin-sdk-authentication)? –

+0

你忽略了'onCanclled()'可能會報告的問題。要抓住它們'throw databaseError.toException()'。請參閱http://stackoverflow.com/documentation/firebase/5548/how-do-i-listen-for-errors-when-accessing-the-database/19721/detect-errors-when-writing-a-value-on -android#t = 201612140118182865968 –

+0

@FrankvanPuffelen不會拋出異常。 – Maxgmer

回答

1

下面的語句拋出一個異常,爲你的循環的每一次迭代:

energyCurrent = (int) childSnap.child("Character").child("energyCurrent").getValue(); 

getValue()上的數值列返回Long,不能拆箱到int,而是拋出:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer 

catch-block中的continue語句將控制權移交給循環的結尾跳過包含呼叫setValue()的代碼。

您可以使用雙投的三句話:

int energyCurrent = (int)(long) dataSnapshot.child("count").getValue(); 

或者讓你的變量long S和使用單個(long)投:

long energyCurrent; 
long energyMax; 
long energyObtain; 
1

你不能投整數長變量,如果你堅持使用它,演員:

try { 
    energyCurrent = (int)(long) childSnap.child("Character").child("energyCurrent").getValue(); 
    energyMax = (int)(long) childSnap.child("Character").child("energyMax").getValue(); 
    energyObtain = (int)(long) childSnap.child("Character").child("energyObtain").getValue(); 
} 

和你應該刪除:

throw databaseError.toException(); 

上的onComplete數據庫