2016-12-13 293 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数据库