如何在firebase中存储和检索自定义对象的ArrayList?在我的android应用程序中,我存储并检索一个数组,如下所示
存储:
ArrayList<GameQRCode> qrCodes = new ArrayList<>();
qrCodes.add(new GameQRCode("name1", "value1"));
qrCodes.add(new GameQRCode("name2", "value2"));
qrCodes.add(new GameQRCode("name3", "value3"));
User user = new User("myUsername");
user.setQrCodes(qrCodes);
db.collection("users").document("myUsername").set(user);
检索:
db.collection("users").document("myUsername").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
ArrayList<GameQRCode> testList = (ArrayList<GameQRCode>) task.getResult().get("qrCodes");
}
});
然而,当我尝试使用检索的ArrayList时,我会收到如下错误消息。。。
GameQRCode qrCode = qrCodes.get(position);
java.util.HashMap不能转换为com.example.qracutie.GameQRCode
非常感谢您的帮助
Firestore不记得您在集合泛型类型中使用的自定义对象的类型,因此您不能在取回文档后简单地按照放入的方式强制转换它。错误消息告诉您,它将数据存储为Map,而不是您的自定义对象类型。您有责任直接处理Map,从中提取值并将其映射回您的自定义对象。这意味着你可能应该像这样提取数据:
List<Map<String, Object> testList =
(List<Map<String, Object>>) task.getResult().get("qrCodes");
事实上,您应该知道Firestore会在内部将所有内容映射到以下基本类型之一:map、List、String、Integer/Long、Boolean、null。您应该期望只得到这些类型,并且可能还应该在强制转换任何内容之前检查instanceof
的类型,以确保在运行时不会进行错误的强制转换。