firebase - Flutter Firebase全局自动增量值并在文档字段dart中检索
问题描述
我对 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
现在这行得通。好吧,我们可以做得更好吗?这里有两个部分,首先增加价值账面,然后检索它。
- 我们可以一口气做到这一点吗?
如果我在返回值时尝试连续非常快地调用此方法,它可能会跳过几个数字。我已经从一个按钮调用它,并尝试尽可能快地按下。我认为计数器增加但它返回相同的数字几次。然后再次按下时跳过一些。例如 1,2,3,4,8,8,8,8,9,10,... 所以在柜台 4 我尝试多次按下按钮。我想知道当多个用户同时添加多本书时这将如何表现。
- 我怎样才能解决这个问题?
请帮忙,谢谢。
解决方案
我认为问题是因为await globalData.document('SomeHardcodedID').updateData
没有产生返回值(void),所以一旦触发下一个调用也执行这没关系,这在大多数情况下没关系。但是,如果 bookId 在很短的时间内(毫秒)调用了几次,则在FieldValue.increment(1)
处理之前会产生数字。