在 firebase 中检索自定义对象的 ArrayList

Retrieving ArrayList of Custom objects in firebase

您将如何在 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 cannot be cast to 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 的类型,以确保您永远不会在运行时进行错误的转换。