【问题标题】:How to detect data is added in firestore during offline android app如何在离线 android 应用程序期间检测数据在 Firestore 中添加
【发布时间】:2018-12-02 21:55:20
【问题描述】:

我正在使用 android 中的 firestore。我想让我的用户在离线模式下将数据保存在应用程序中。(离线期间插入数据也可以正常工作)但我不知道如何检测到数据是在离线模式下添加的,我需要获取文档添加的 id。在在线模式下,我可以使用侦听器检测数据插入。

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);
            }
        });

我还需要检测应用离线时添加的内容。那我怎么能?因为这些监听器只有在数据被插入到服务器并且应用从服务器得到响应时才起作用。

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    只有在数据提交到服务器后才会调用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);
    

    CollectionReference.document()

    【讨论】:

    • 但我无法在 add(data) 方法上调用 addOnSnapShotListener。它给出了找不到方法的错误。
    • 我希望您已经在 db.collection("cities") 上拥有一个监听器,应该将这些更改通知给它。如果您还没有,请认真考虑添加一个,因为这是从服务器和本地更改获取所有数据的最简单方法。但除此之外,您可以使用db.collection("cities").document()(不带参数,请参阅docs)生成新的DocumentReference 并将快照侦听器添加到其中。
    • 但出于好奇:这段代码试图做什么? add() 将始终将文档写入本地数据库。不需要试图捕捉它的成功,你可以假设它在正常操作中工作。如果没有,它会引发一个您的应用程序可能无法解决的异常。
    • 我需要获取新添加的文档Id。
    • 那就简单多了:DocumentReference newDoc = db.collection("cities").document(); System.out.println(newDoc.getId()); newDoc.set(data);
    【解决方案2】:

    离线插入监听器。 根据我的代码测试,删除成功和快照侦听器就可以了。只需检查文档 id 是否不为空且其长度是否大于 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
                 }
    

    感谢弗兰克之前提供的线索。 add() 将始终将文档写入本地.....在我的例子中是 set() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2016-02-28
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多