使用 toObject 方法将 Snapshot 转换为 POJO 时,将包含 Date 对象的代码转换为 Fireba



我注意到每次运行应用程序代码时都收到以下警告

W/Firestore: (0.6.6-dev( [Firestore]:存储在 Firestore 中的 java.util.Date 对象的行为将发生变化 并且您的应用程序可能会中断。 要隐藏此警告并确保您的应用程序不会中断,您需要在调用任何其他 Cloud Firestore 方法之前将以下代码添加到您的应用程序:

FirebaseFirestore firestore = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setTimestampsInSnapshotsEnabled(true)
.build();
firestore.setFirestoreSettings(settings);

通过此更改,存储在Cloud Firestore中的时间戳将作为com.google.firebase.Timestamp对象读回,而不是作为系统java.util.Date对象。因此,您还需要更新期望java.util.Date的代码,而不是期望时间戳。例如:

// Old:
java.util.Date date = snapshot.getDate("created_at");
// New:
Timestamp timestamp = snapshot.getTimestamp("created_at");
java.util.Date date = timestamp.toDate();

请在启用新行为时审核 java.util.Date 的所有现有用法。在将来的版本中,行为将更改为新行为,因此,如果不执行这些步骤,应用可能会中断。

警告中提供的示例建议了从 DocumentSnapshot 单独提取每个文档对象时转换代码的最佳方法。

我的问题是- 如果您在 DocumentSnapshot 上使用.toObject()方法直接从中获取 POJO,在这种情况下是否有建议/优化的更新代码/数据模型的方法?

由于以下方案java.util.Date目前已在应用中使用 -

  1. 由于有很多地方在整个应用程序中使用日期对象。
  2. Date 也是一些 Map 数据类型对象的值(例如。Map<String, Date>(。如何在没有太多重大更改的情况下处理 documentSnapshot 中此类数据对象的代码转换?

我已经想到的一种方法是使用java.util.Date字段更新 POJO 以com.google.firebase.Timestamp以及Map<K, V>实现。之后,通过在时间戳字段调用后添加.toDate()来更新代码实现。但这种方式似乎并没有优化

使用 toObject(( 时,Firestore SDK 会自动将时间戳文档字段转换为 POJO 类成员的日期对象。 它能够在运行时检测类型以进行转换。

您引用的警告适用于在直接访问快照数据时尝试假定对象类型的代码。

最新更新