我正在尝试从Firebase数据库接收costum对象。 我总是得到一个例外,我不明白为什么......
-------崩溃开始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)
at java.lang.reflect.Method.invoke(Native Method)
在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
这是我将对象加载到DB中的方式:
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有什么问题
如果有人可以帮助我,那会很棒。 我希望这些是足够的信息。
我在几天之后找到了解决方案...... 清理代码时,我发现了一个不同类的代码片段:
public void setGivenClues(Clue clue){ givenClues.add(clue); }
由于这个setter,应用程序崩溃了。在我的Player-object(游戏对象的一部分)里面是一个线索列表。此setter应在列表中添加单个线索。但Firebase将其解释为整个列表的制定者。重命名我的setter并更改调用代码后,一切都很好!
答案 0 :(得分:0)
使用9.x版本的Firebase,您可以使用@Exclude忽略以“get”开头的方法。