2016-12-13 1 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 블록의 문이 루프의 끝까지 제어를 전달합니다. 본문, setValue()에 대한 호출이 포함 된 코드를 건너 뜁니다.

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

을 아니면 변수 long들하고 하나의 (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를 데이터베이스

관련 문제