【问题标题】:Receiving object from Firebase isn´t working从 Firebase 接收对象不起作用
【发布时间】:2016-07-29 15:37:09
【问题描述】:

我正在尝试从我的 Firebase 数据库中接收一个服装对象。 我总是遇到异常,我不知道为什么......

------- 崩溃开始 06-17 08:26:56.208 13875-13875/com.example.jendrik.moerder E/AndroidRuntime: FATAL 例外:主要
进程:com.example.jendrik.moerder,PID:13875
com.google.firebase.database.DatabaseException:无法转换对象 要键入的 java.util.ArrayList 类型 com.example.jendrik.moerder.GameObjekts.Clue
在 com.google.android.gms.internal.zzaix.zzd(未知来源)
...很多双重错误...
在 com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 com.example.jendrik.moerder.FCM.FCMListeners.updateGame(FCMListeners.java:64) 在 com.example.jendrik.moerder.FCM.FCMListeners.access$000(FCMListeners.java:26) 在 com.example.jendrik.moerder.FCM.FCMListeners$1.onDataChange(FCMListeners.java:105) 在 com.google.firebase.database.Query$1.onDataChange(未知来源)
在 com.google.android.gms.internal.zzafp.zza(未知来源)
在 com.google.android.gms.internal.zzagp.zzSu(未知来源)
在 com.google.android.gms.internal.zzags$1.run(未知来源)
在 android.os.Handler.handleCallback(Handler.java:739)
在 android.os.Handler.dispatchMessage(Handler.java:95)
在 android.os.Looper.loop(Looper.java:224)
在 android.app.ActivityThread.main(ActivityThread.java:5526)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这就是我将对象加载到数据库中的方式:

public void sendGame(Game game){
    DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
    myRef.child("games").child(gameName).setValue(game);
}

这是我收到它的方式:

 public FCMListeners(String gameName, GameStartedCallback callback){

    this.gameName=gameName;
    this.callback = callback;
    gameReference = FirebaseDatabase.getInstance().getReference().child("games").child(gameName);
    gameListener = makeGameListener();
    gameReference.addListenerForSingleValueEvent(gameListener);
}



public ValueEventListener makeGameListener(){

    ValueEventListener ve =
            new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    updateGame(dataSnapshot);
                    callback.startGameAfterReceivingInformation();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            };

    return ve;
}

private void updateGame(DataSnapshot snapshot){
    Log.d("tollewurst",snapshot.getKey());
    Game game=snapshot.getValue(Game.class);
    this.game=game;
}

public Game getGame(){
    return game;
}

从正在运行的类中我调用 FCMListener 进行接收:

 private FCMListeners fcmListeners;

private void startGame(){
    myRef.removeEventListener(el);
    gamestarter.removeEventListener(elGame); //these are listeners for other informations who are not used anymore at this point

    fcmListeners = new FCMListeners(gameName, this);
}

public void startGameAfterReceivingInformation(){
    Intent intent = new Intent(this,MenueDrawer.class);
    intent.putExtra("gameName", gameName);
    intent.putExtra("whoAmI", checkForPlayerNumber());

    Game game = fcmListeners.getGame();
    intent.putExtra("GAME", game);
    Log.d("start",game.getGameName());

    startActivity(intent);
}

我的回调接口:

public interface GameStartedCallback {
void startGameAfterReceivingInformation();
}

这是我的 Game.class - 接收对象的类:

@Getter @Setter
@IgnoreExtraProperties
public class Game implements Serializable {

private Solution solution;
private RoomManager roomManager;
private WeaponManager weaponManager;
private PlayerManager playerManager;
private List<Clue> clueList;
private double numberOfThings;
private String gameName;
private String pwd;
private double min;
private double sec;
private double justScannedQR;
private double playerAmount;
private boolean gameOver;
private boolean isRunning;

public Game(String gameName, String pwd, ArrayList<String> rooms, ArrayList<String> weapons, int min, int sec, int playerAmount){
    this.gameName = gameName;
    this.pwd = pwd;
    this.min = min;
    this.sec = sec;
    solution = null;
    clueList = new ArrayList<>();
    playerManager = new PlayerManager(false);
    weaponManager = new WeaponManager(false);
    roomManager = new RoomManager(false);
    createRooms(rooms);
    createWeapons(weapons);
    numberOfThings = rooms.size() + weapons.size();
    justScannedQR = 0;
    this.playerAmount = playerAmount;
    gameOver = false;
}

public Game(){} //and then a lot of methods who are @Exclude

由于错误对话框中的“未知路径”部分,我已经尝试过以不同方式切换子节点。不出所料,没有任何运气。

奇怪的是,在其他方面我没有列表和单个值的问题(目前大多数布尔值)。我猜我的 Game.class 有问题

如果有人可以帮助我,那就太好了。 我希望这些是足够的信息。

几天后我找到了解决方案... 在清理代码时,我在不同的类中发现了一个 sn-p:

public void setGivenClues(Clue clue){ givenClues.add(clue); }

由于这个设置器,应用程序崩溃了。在我的玩家对象(游戏对象的一部分)内部是一个线索列表。此设置器应在列表中添加单个线索。但 Firebase 将其解释为整个列表的设置器。重命名我的设置器并更改调用代码后一切都很好!

【问题讨论】:

  • 玩了几天后,我找到了解决方案。我已经编辑了帖子。

标签: java android firebase


【解决方案1】:

使用 9.x 版本的 Firebase,您可以使用 @Exclude 忽略以“get”开头的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多