颤振Firebase全局自动增量值和在文档字段中检索dart
我对Firebase Flatter是个新手。我正在开发一个移动应用程序来与其他人共享书籍 在firebase firestore颤振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。 一种方法是获取图书列表,找到长度(计数),并在创建新记录时
- 我有“用户”集合,其中包含具有唯一id的所有用户数据
- 我有“books”集合,其中包含自动创建的具有唯一id的所有书籍数据
- 此外,我还有一个“全局”集合,其中包含一个名为“bookcount”的整型字段的单个文档
- 用户可以有很多书
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的值,然后检索它
请帮助,谢谢。我认为问题是因为
等待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”输出?