Не удается получить обновления в реальном времени с Cloud Firestore - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь получать обновления в реальном времени с Cloud Firestore. Несмотря на то, что чтение и запись выполнены успешно, я не могу получить уведомление об обновлении со следующим кодом в Kotlin:

    val collectionName = "users"
    val docId = "alovelace"
    val docRef = db.collection(collectionName).document(docId)
    docRef.addSnapshotListener({ doc, e ->
      System.out.println("Updated")
      if (doc != null) {
          if (doc.exists()) {
            System.out.println("Current data: " + doc.getData())
          }
          else {
            System.out.println("Current data: null")
          }
      }
      else {
          e!!.printStackTrace()
      }
    })

Я могу прочитать из docRef , и, следовательно, это действительная ссылка на документ:

    System.out.println("Get " + docRef.get().get().getData())
    //print Get {last=Lovelace, born=1915, first=Bob}

Я также следовал другому примеру кода, чтобы обернуть его как функцию и вернуть при наличии одного снимка, но все еще напрасно

    fun listenToDocument(
      db: Firestore,
      collection: String,
      document: String
    ): Map<String, Any>{
    val future = SettableApiFuture.create<Map<String, Any>>();

    // [START listen_to_document]
    val docRef = db.collection(collection).document(document)
    docRef.addSnapshotListener(object: EventListener<DocumentSnapshot> {
      override fun onEvent(
        snapshot: DocumentSnapshot?,
        e: FirestoreException?
      ) {
        if (e != null) {
          System.err.println("Listen failed: " + e);
          return;
        }

        if (snapshot != null && snapshot.exists()) {
          System.out.println("Current data: " + snapshot.getData());
        } else {
          System.out.print("Current data: null");
        }
        // [START_EXCLUDE silent]
        if (!future.isDone()) {
          future.set(snapshot!!.getData());
        }
        // [END_EXCLUDE]
      }
    });
    // [END listen_to_document]

    return future.get(TIMEOUT_SECONDS, TimeUnit.SECONDS)
  }

    Thread( fun() {
      val update = listenToDocument(db, collectionName, docId)
      System.out.println(update)
    }).start()

Я обновил поля документа из Интернетаинтерфейс, а также следующий код:

    val writeDocRef = db.collection(collectionName).document(docId)
    // Add document data  with id "alovelace" using a hashmap
    val data = HashMap<String, Any>()
    data.put("first", "Ada")
    data.put("last", "Lovelace")
    data.put("born", 1815)
    //asynchronously write data
    val result = writeDocRef.set(data)
    // result.get() blocks on response
    System.out.println("Update time : " + result.get().getUpdateTime())

Запись также выполнена успешно, но я просто не вижу никаких выходных данных из функции onEvent, то есть она никогда не вызывается. Я просмотрел несколько других примеров, в том числе официальные руководства , но все они похожи. И я не видел, чтобы кто-нибудь жаловался на это ... пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...