首页 > 解决方案 > 如何从 Firebase Firestore 获取自定义对象?

问题描述

我正在使用自定义类来存储和检索 Firestore 数据库中的数据。这是我的自定义类:

public class SentMessage {
    private String sender;
    private String receiver;
    private String message;
    private String time;
    private boolean isImage;
    private boolean isArchived;
    @ServerTimestamp
    private Date timestamp;
    private String userId;

    public SentMessage(String sender, String receiver, String message, String time, boolean isImage, String userId) {
        this.sender = sender;
        this.receiver = receiver;
        this.message = message;
        this.time = time;
        this.isImage = isImage;
        this.isArchived = false;
        this.userId = userId;
    }
}

我在 firesotre 中的数据如下所示:

在此处输入图像描述

我正在使用以下查询:

database.collection("Sent Messages").whereEqualTo("Sender", email).whereEqualTo("isArchived", false).get()
                                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                                    @Override
                                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                                        for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                                            Log.d("cs50", "documentSnapshot.toObject(SentMessage.class).getMessage() = " + documentSnapshot.toObject(SentMessage.class).getMessage());
                                            Log.d("cs50", "documentSnapshot.getString(\"Message\") = " + documentSnapshot.getString("Message"));
                                            if (documentSnapshot.toObject(SentMessage.class) == null) {
                                                Log.d("cs50", "documentSnapshot.toObject(SentMessage.class) is null");
                                            } else {
                                                Log.d("cs50", "documentSnapshot.toObject(SentMessage.class) is not null");
                                            }
                                            SentMessage tempSentMessage = new SentMessage(documentSnapshot.getString("Sender"), documentSnapshot.getString("Receiver"), documentSnapshot.getString("Message"), documentSnapshot.getString("Time"), documentSnapshot.getBoolean("isImage"), documentSnapshot.getString("userId"));
                                            Log.d("cs50", "tempSentMessage.getMessage() = " + tempSentMessage.getMessage());
                                            sentMessages.add(documentSnapshot.toObject(SentMessage.class));
                                        }
                                }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.e("cs50", "Error getting sent messages", e);
                            }
                        });

这是我的 logcat 输出:

2020-09-23 00:02:27.395 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.395 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Do
2020-09-23 00:02:27.402 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.404 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Do

2020-09-23 00:02:27.417 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.418 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Just
2020-09-23 00:02:27.424 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.425 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Just

2020-09-23 00:02:27.436 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.436 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Cube
2020-09-23 00:02:27.440 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.442 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Cube

2020-09-23 00:02:27.450 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.450 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Dump
2020-09-23 00:02:27.454 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.455 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Dump

2020-09-23 00:02:27.462 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.463 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Sell
2020-09-23 00:02:27.466 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.467 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Sell

2020-09-23 00:02:27.474 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.475 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Pixel
2020-09-23 00:02:27.478 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.480 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Pixel

2020-09-23 00:02:27.486 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.487 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Bill
2020-09-23 00:02:27.490 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.491 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Bill

2020-09-23 00:02:27.498 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.498 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Can
2020-09-23 00:02:27.501 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.503 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Can

2020-09-23 00:02:27.509 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.510 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Last party
2020-09-23 00:02:27.513 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.515 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Last party

2020-09-23 00:02:27.520 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.520 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Do
2020-09-23 00:02:27.522 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.524 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Do

2020-09-23 00:02:27.529 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class).getMessage() = null
2020-09-23 00:02:27.529 4465-4465/com.example.treeapp D/cs50: documentSnapshot.getString("Message") = Some
2020-09-23 00:02:27.531 4465-4465/com.example.treeapp D/cs50: documentSnapshot.toObject(SentMessage.class) is not null
2020-09-23 00:02:27.533 4465-4465/com.example.treeapp D/cs50: tempSentMessage.getMessage() = Some

我也尝试过使用不同的字段(时间),我得到了类似的输出。

为什么它documentSnapshot.toObject(SentMessage.class).getMessage()是空的,而documentSnapshot.toObject(SentMessage.class)不是空的?我已经确认我的自定义类工作正常,因为tempSentMessage.getMessage()它不为空。

我稍后在查询中做的onSuccess()是 check for (SentMessage sentMessage : sentMessages) if (sentMessage.getReceiver().equals(peerEmail)),除其他外,这给了我一个错误,因为sentMessage,它是 的一个元素sentMessages,为空。那是我得到原始错误的地方,然后我添加了日志语句。

标签: androidfirebasegoogle-cloud-firestore

解决方案


您的文档数据与“消息”字段的类定义不正确匹配。

当您有一个名为“getMessage”的 Java getter 时,Firestore SDK 将尝试用一个名为“message”的字段(使用小写的“m”)填充它。您的字段是带有大写 M 的“消息”。这是 JavaBeans 规范将值映射到 Java 对象的方式。大小写是不可原谅的——它们必须完全匹配。

您应该将字段的名称更改为“消息”以适合您的 Java 类,或者使用@PropertyName使用与 JavaBeans 规范要求不同的文档字段名称来注释对象属性。


推荐阅读