Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
颤振Firebase全局自动增量值和在文档字段中检索dart_Firebase_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

颤振Firebase全局自动增量值和在文档字段中检索dart

颤振Firebase全局自动增量值和在文档字段中检索dart,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我对Firebase Flatter是个新手。我正在开发一个移动应用程序来与其他人共享书籍 在firebase firestore 我有“用户”集合,其中包含具有唯一id的所有用户数据 我有“books”集合,其中包含自动创建的具有唯一id的所有书籍数据 此外,我还有一个“全局”集合,其中包含一个名为“bookcount”的整型字段的单个文档 用户可以有很多书 现在我想为book创建另一个唯一的id字段。其思想是使用简单的整数id。 一种方法是获取图书列表,找到长度(计数),并在创建新记录时

我对Firebase Flatter是个新手。我正在开发一个移动应用程序来与其他人共享书籍

在firebase firestore

  • 我有“用户”集合,其中包含具有唯一id的所有用户数据
  • 我有“books”集合,其中包含自动创建的具有唯一id的所有书籍数据
  • 此外,我还有一个“全局”集合,其中包含一个名为“bookcount”的整型字段的单个文档
  • 用户可以有很多书
现在我想为book创建另一个唯一的id字段。其思想是使用简单的整数id。 一种方法是获取图书列表,找到长度(计数),并在创建新记录时添加1。我已经排除了这种方法,因为如果许多用户同时使用,我认为这可能会导致重复ID

因此,我创建了另一个具有单个文档和字段名bookcount的全局集合。其中包含藏书数量(粗略计算)。所以,我们的想法是,每次向集合中添加一本书时,都要增加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
类数据库服务{
...
...
//final CollectionReference bookCollection=Firestore.instance.collection('users');
//final CollectionReference bookCollection=Firestore.instance.collection('books');
最终集合引用globalData=Firestore.instance.collection('global');
...
... 
Future bookId()异步
{
字符串uniquebookid=await globalData.document('SomeHardcodedID').updateData(
{
“bookcount”:字段值。增量(1)
}).then((voidvalue)异步
{
字符串cid=wait globalData.getDocuments()。然后((bookvalue)=>bookvalue.documents.single.data['bookcount'].toString());
返回cid;
});
返回uniquebookid;
}//未来图书编号
...
...
}//阶级
现在这是可行的。嗯,我们能做得更好吗?在这里有两个部分,首先增加bookcount的值,然后检索它

  • 我们能一次完成吗
  • 如果我在返回值时尝试连续快速调用此方法,它可能会跳过几个数字。我用一个按钮打电话,然后尽可能快地按。我想计数器会增加,但它会返回 同样的数字有几次。再次按下时跳过一些。例如1,2,3,4,8,8,8,8,8,9,10,。。。所以在4号柜台,我试着按下按钮多次。我想知道当多个用户同时添加多本书时,这将如何表现

  • 我怎样才能解决这个问题

  • 请帮助,谢谢。

    我认为问题是因为
    等待globalData.document('SomeHardcodedID')。updateData
    不会生成返回值(void),一旦触发下一个调用,也会执行该调用,这对大多数情况都是正确的。
    但是,如果bookId在很短的时间内(毫秒)调用了几次,这将在
    FieldValue.increment(1)
    过程之前生成数字。

    我认为问题在于
    等待globalData.document('SomeHardcodedID')。updateData
    不会生成返回值(void),一旦这个调用被触发,下一个调用也会执行,这在大多数情况下都是可以的。
    但是,如果bookId在很短的时间内(毫秒)调用了几次,这将在
    FieldValue.increment(1)
    进程之前生成一个数字。

    如果不告诉您,increment似乎不太可能失败。你能添加一个捕获,看看是否有错误吗?增量未失败,看起来从db获取bookcount比增量慢。这可能是,但不应导致
    FieldValue.increment
    操作行为不当(我也不确定它是否会)。您在哪里看到“1,2,3,4,8,8,8,8,9,10”输出?如果不告诉您,增量不太可能失败。你能添加一个捕获,看看是否有错误吗?增量未失败,看起来从db获取bookcount比增量慢。这可能是,但不应导致
    FieldValue.increment
    操作行为不当(我也不确定它是否会)。您在哪里看到“1,2,3,4,8,8,8,8,9,10”输出?