使用toObject方法将快照转换为POJO时,将包含Date对象的代码转换为Firebase.Timestamp对象的最佳方法。

时间:2018-07-02 20:38:00

标签: java android firebase google-cloud-firestore java.util.date

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

  

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

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

1 个答案:

答案 0 :(得分:1)

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

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

相关问题