【问题标题】:Firestore offline persistence flutter docIdFirestore 离线持久性颤振 docId
【发布时间】:2021-04-25 22:17:44
【问题描述】:

我有一个使用 firestore 的应用程序,当用户单击按钮时,我添加了一个文档,在其创建后,我还将其 documentId 添加到 field 中,该字段是由 firestore 生成的字母数字字符串。我的问题是,如果用户在没有互联网的情况下单击按钮,然后关闭应用程序并通过互联网连接打开它,文档就会创建,但它内部的 Id 当然是空的,因为程序停止执行。有没有办法让我坚持下去?

例如

DocumentReference documentReference =
      await FirebaseFirestore.instance.collection('sth').add(map); //map has a 'docId' key

 await FirebaseFirestore.instance
  .collection('sth')
  .doc('${documentReference.id}')
  .update({'docId': documentReference.id});

更新的没有离线持久化,有什么办法解决吗?

【问题讨论】:

  • 尝试使用set 而不是update
  • 不适用于set

标签: flutter google-cloud-firestore offline


【解决方案1】:

正如 Dima 所评论的,您可以通过首先生成 ID 来解决此问题,然后才使用数据及其 ID 编写文档。

要生成一个文档ID而不写它,你可以call doc() on the CollectionReference without an argument

DocumentReference documentReference =
     FirebaseFirestore.instance.collection('sth').doc();

map["docId"] = documentReference.id;

FirebaseFirestore.instance
  .collection('sth')
  .doc('${documentReference.id}')
  .set(map);

现在第一行是一个纯粹的客户端操作,还没有任何数据写入数据库 - 所以你最终得到一个单一的原子写入/set()

【讨论】:

  • 我们基本上做同样的事情,你创建一个黑色文档,而我写一个新文档。我认为问题在于,由于 documentReference.id 是一个运行时变量,因此当我再次启动应用程序并自动发出请求时,该值在该时间点为空。有没有办法解决这个问题?
  • 答案其实在中间。我应该创建一个文档引用但没有 await 方法,然后再次使用该 id 设置文档而不等待,因为我需要像上面一样的所有其他函数来缓存。然后,当用户再次找到互联网时,正在调用这些函数。主要问题在于使用 await。
  • 确实不需要我第一个sn-p中的await;我删除了它。关于我的回答更重要的是,不带任何参数的 doc() 调用确实实际上在数据库中创建了一个文档,而只是一个参考。只有调用 set() 才能创建文档。
  • @user14624595 你有什么进展吗?
  • 完成。很高兴听到你成功了。 ?
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2018-10-25
  • 2019-03-06
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
相关资源
最近更新 更多