android - 如何从 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
,为空。那是我得到原始错误的地方,然后我添加了日志语句。
解决方案
您的文档数据与“消息”字段的类定义不正确匹配。
当您有一个名为“getMessage”的 Java getter 时,Firestore SDK 将尝试用一个名为“message”的字段(使用小写的“m”)填充它。您的字段是带有大写 M 的“消息”。这是 JavaBeans 规范将值映射到 Java 对象的方式。大小写是不可原谅的——它们必须完全匹配。
您应该将字段的名称更改为“消息”以适合您的 Java 类,或者使用@PropertyName使用与 JavaBeans 规范要求不同的文档字段名称来注释对象属性。
推荐阅读
- latex - 如何在 Latex 中使用“&”
- bash - 如何在script.sh文件的函数列表中一个一个地执行两个函数
- google-chrome-extension - 如何在 chrome 扩展项目中使用按钮在两种语言之间切换
- java - 如何在不同类型的Java中创建一个包含2个数组的数组
- linux - 如何使用 ansible 启动实例并开始使用 Ansible 配置环境
- javascript - 如何在 ReactJS 中计算滚动条上的元素
- javascript - 如何避免html5视频中的playbackRate变量变化以及如何克服它?
- objective-c - 在 macOS 的循环执行期间允许用户输入
- android - Android 6 上的原生粉碎?
- sql - 重复值不应在 SQL 中一起显示