【问题标题】:Reading and writing data in Firebase在 Firebase 中读取和写入数据
【发布时间】:2016-12-13 18:39:37
【问题描述】:

我需要在我的 Android 应用中增加每个用户的能量值。

这是我的数据库的方案:

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

我使用此代码阅读、进行一些计算并写入数据,但我的 Firebase 数据库中没有任何变化。此代码位于 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();
                }
            });

【问题讨论】:

标签: android google-app-engine firebase firebase-realtime-database


【解决方案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 块中的continue 语句将控制转移到循环体的末尾,跳过包含对setValue() 的调用的代码。

您可以对这三个语句使用双重转换:

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

或者将变量设为longs 并使用单个(long) 演员表:

long energyCurrent;
long energyMax;
long energyObtain;

【讨论】:

    【解决方案2】:

    您不能在 long 变量中转换整数,如果您坚持使用它,请转换:

    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 数据库上

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      相关资源
      最近更新 更多