【问题标题】:Flutter Firebase global Auto Incremental value and retrieving in document field dartFlutter Firebase全局自动增量值并在文档字段dart中检索
【发布时间】:2020-12-01 17:16:28
【问题描述】:

我对 Firebase Flutter 还是很陌生。我正在开发一个移动应用程序来共享书籍。

在 Firebase Firestore 中,

  • 我有“用户”集合,其中包含具有唯一 ID 的所有用户数据
  • 我有一个“书籍”集合,其中包含所有具有自动创建的唯一 ID 的书籍数据
  • 此外,我还有一个包含单个文档的“全局”集合,其中包含一个名为“bookcount”的整数字段。
  • 用户可以拥有多本书。

现在我想为书创建另一个唯一的 id 字段。想法是有简单的整数id。 一种方法是获取书籍列表并找到长度(计数)并在创建新记录时加 1。我已经排除了这种方法,好像很多用户同时使用,我认为这会导致重复的id。

所以我创建了另一个具有单个文档和字段名称 bookcount 的全局集合。其中包含书籍收藏的书籍数量(粗略计数)。所以想法是每次将一本书添加到集合中时都会增加书籍数量并将此值用作一本书的简单唯一 ID。这个 bookcount 可能不代表实际的书籍,因为用户可以在保存之前丢弃书籍条目,这没关系,因为我只需要一个简单的唯一 id。

class DatabaseService {
      ...
      ...
  
  //final CollectionReference bookCollection = Firestore.instance.collection('users');
  //final CollectionReference bookCollection = Firestore.instance.collection('books');
  final CollectionReference globalData = Firestore.instance.collection('global');
      ...
      ... 
Future<String> bookId() async 
    {
        String uniquebookid =  await globalData.document('SomeHardcodedID').updateData(
        {
        'bookcount': FieldValue.increment(1)
        }).then((voidvalue) async 
        {
            String cid = await globalData.getDocuments().then((bookvalue) => bookvalue.documents.single.data['bookcount'].toString());
            return cid;
        });
    return uniquebookid;
    }//future bookId
      ...
      ...
}//class

现在可以了。好吧,我们可以做得更好吗?这里有两部分,首先增加 value bookcount,然后检索它。

  1. 我们可以一次性完成吗?

如果我在返回值时尝试连续非常快地调用此方法,它可能会跳过几个数字。我已经从一个按钮调用它,并尝试尽可能快地按下。我认为计数器增加但它返回 几次相同的数字。然后再次按下时跳过一些。例如 1,2,3,4,8,8,8,8,9,10,... 所以在柜台 4 我尝试多次按下按钮。我想知道当多个用户同时添加多本书时这会如何表现。

  1. 我该如何解决这个问题?

请帮忙,谢谢。

【问题讨论】:

  • 在不告诉您的情况下,增量似乎非常不太可能失败。你可以添加一个catch,看看你是否得到错误? dart.dev/guides/libraries/futures-error-handling
  • 增量没有失败,看起来从 db 获取 bookcount 比增量慢。
  • 这可能是,但不应该导致 FieldValue.increment 操作行为不端(我还不确定它是否如此)。你在哪里看到“1,2,3,4,8,8,8,8,9,10”的输出?

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

我认为问题是因为await globalData.document('SomeHardcodedID').updateData 没有产生返回值(void),一旦这个触发下一个调用也执行,这没关系,在大多数情况下没关系。 但是,如果 bookId 在很短的时间内(毫秒)调用了几次,则在 FieldValue.increment(1) 进程之前生成此编号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多