代码之家  ›  专栏  ›  技术社区  ›  Asif Mushtaq

如何检测数据在FixSt店在离线Android应用程序中添加

  •  1
  • Asif Mushtaq  · 技术社区  · 7 年前

    我在Android中使用FixSt店。我想让我的用户在脱机模式下保存应用程序中的数据。(脱机期间的数据插入也很好)但是我不知道如何检测在离线模式下添加的数据,我需要得到添加的文档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);
                }
            });
    

    我还需要在应用程序脱机时检测添加的内容。那我该怎么办?因为这些监听器只在数据被插入服务器并且应用程序从服务器获得响应时才工作。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Frank van Puffelen    7 年前

    这个 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() .

        2
  •  0
  •   user11091094    7 年前

    脱机插入侦听器。 根据我的代码测试,删除success和snapshot监听器都没问题。只需检查文档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()方法。

    推荐文章