我正在使用Android中的Firestore。我想允许我的用户在脱机模式下将数据保存在应用中。(脱机期间的数据插入也可以正常工作)但是我不知道如何检测到在脱机模式下添加了数据,我需要获取文档添加的ID。在联机模式下,我可以使用侦听器as来检测数据插入。
Map<String, Object> data = new HashMap<>();
data.put("name", "Tokyo");
data.put("country", "Japan");
db.collection("cities")
.add(data)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error adding document", e);
}
});
我还需要检测应用程序离线时添加的内容。那我该怎么办?因为这些侦听器仅在将数据插入服务器中并且应用程序从服务器获得响应时才起作用。
答案 0 :(得分:2)
addOnSuccessListener
仅在数据提交到服务器后才被调用。这是其明确的目标。如果本地客户端在将数据添加到本地后还需要数据,则可以使用常规的addSnapshotListener
。
来自documentation on events for local changes:
应用程序中的本地写入将立即调用快照侦听器。这是由于称为“延迟补偿”的重要功能。当您执行写操作时,将在数据发送到后端之前在 通知您的侦听器。
检索到的文档具有
metadata.hasPendingWrites
属性,该属性指示文档是否具有尚未写入后端的本地更改。您可以使用此属性来确定快照侦听器收到的事件的来源。
有关如何处理此示例代码,请参见链接的文档。
更新:如果您只是想获取新文档的ID,则只需执行以下操作:
DocumentReference newDoc = db.collection("cities").document();
System.out.println(newDoc.getId());
newDoc.set(data);
答案 1 :(得分:0)
脱机插入侦听器。 根据我的代码测试,可以同时删除成功侦听器和快照侦听器。只需检查文档ID是否不为null且其长度大于10。这足以使我得出成功插入的结论。代码:
docRef.collection("collectioname").document("docname").set(aMap);
String id = docRef.collection("collectioname").document("docname").getId();
if( id != null & !id.isEmpty() & id.length() > 10) {
//Action here
}
谢谢弗兰克(Frank)的早期线索。 add()将始终将文档写入本地.....在我的情况下,是set()方法。