我想更新一个文档字段,但是我尝试了以下代码,但是没有更新。
有人可以给我一个解决方案吗?
我的代码:
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 !
}
});
答案 0 :(得分:1)
对于这种情况,我总是建议您遵循documentation中的确切类型,以查看可用的选项。例如,DocumentSnapshot
object的data
属性是Map<String, dynamic>
。调用update()
时,您只是在更新文档的内存表示形式,而实际上没有更新数据库中的数据。
要更新数据库中的文档,您需要调用DocumentReference.updateData
method。为了从DocumentSnapshot
到DocumentReference
,您叫DocumentSnapshot.reference
property。
类似这样:
document.reference.updateData(<String, dynamic>{
name: this.name
});
与此无关,您的代码看起来有些惯用。我建议使用getDocuments
代替snapshots()
,因为后者可能会导致无限循环。
var snapshots = _firestore
.collection('profile')
.document(currentUserID)
.collection('posts')
.getDocuments();
await snapshots.forEach((document) async {
document.reference.updateData(<String, dynamic>{
name: this.name
});
})
此处的区别在于getDocuments()
读取一次数据并将其返回,而snapshots()
将开始观察文档,并在发生任何更改(包括更新名称)时将其传递给我们)。
答案 1 :(得分:1)
API 中有很多变化,例如,Firestore
被替换为 FirebaseFirestore
,doc
被替换,等等。
更新文档
var collection = FirebaseFirestore.instance.collection('collection');
collection
.doc('some_id') // <-- Doc ID where data should be updated.
.update({'key' : 'value'}) // <-- Updated data
.then((_) => print('Updated'))
.catchError((error) => print('Update failed: $error'));
更新文档中的嵌套值:
var collection = FirebaseFirestore.instance.collection('collection');
collection
.doc('some_id') // <-- Doc ID where data should be updated.
.update({'key.foo.bar' : 'nested_value'}) // <-- Nested value
.then((_) => print('Updated'))
.catchError((error) => print('Update failed: $error'));