我想更新一个文档字段,我尝试了下面的代码,但它没有更新。
有谁能给予我个解决办法吗?
我的代码:
var snapshots = _firestore
.collection('profile')
.document(currentUserID)
.collection('posts')
.snapshots();
await snapshots.forEach((snapshot) async {
List<DocumentSnapshot> documents = snapshot.documents;
for (var document in documents) {
await document.data.update(
'writer',
(name) {
name = this.name;
return name;
},
);
print(document.data['writer']);
//it prints the updated data here but when i look to firebase database
//nothing updates !
}
});
3条答案
按热度按时间pxy2qtax1#
对于这样的情况,我总是建议遵循documentation中的确切类型,看看有哪些选项可用。例如,
DocumentSnapshot
object的data
属性是Map<String, dynamic>
。当你在上面调用update()
时,你只是更新了文档在内存中的表示,而不是实际更新数据库中的数据。要更新数据库中的文档,需要调用
DocumentReference.updateData
method,要从DocumentSnapshot
获取到DocumentReference
,需要调用DocumentSnapshot.reference
property。比如:
与此无关,您的代码看起来有点不习惯,我建议使用
getDocuments
而不是snapshots()
,因为后者可能会导致无限循环。这里的区别在于
getDocuments()
读取数据一次,然后返回数据,而snapshots()
将开始观察文档,并在发生更改时(包括更新名称时)将其传递给我们。bvhaajcl2#
2021年更新:
API中的很多东西都发生了变化,例如,
Firestore
被FirebaseFirestore
替换,doc
被加入,等等。*更新文档
*更新文档中的嵌套值:
x6yk4ghg3#
使用
null safety
更新2023要更新文档的某些字段而不覆盖整个文档,请使用以下特定于语言的
update()
方法:服务器时间戳
您可以将文档中的字段设置为服务器时间戳,该时间戳用于跟踪服务器接收更新的时间。
更新嵌套对象中的字段
如果文档包含嵌套对象,则可以在调用update()时使用"点标记法"引用文档中的嵌套字段:
更新数组中的元素
如果文档包含数组字段,则可以使用arrayUnion()和arrayRemove()添加和删除元素。arrayUnion()向数组添加元素,但仅添加不存在的元素。arrayRemove()删除每个给定元素的所有示例。
递增数值
您可以递增或递减数值字段值,如下例所示。递增操作按给定的量递增或递减字段的当前值。