在我的Flutter程序中,我使用Firestore存储名为DocumentA的文档,其中包含一个名为List的数组属性。在程序执行过程中,我从Firestore中检索了这个文档。在某些时候,我可能会修改列表中的某个产品,并希望将更改同步回Firestore。最初,我想到根据MusicItem的属性查询它的具体位置,然后更新目标对象。但是,我认为这种方法并不理想,因为它需要在每次需要更新时查询整个列表。有没有更好的办法处理这件事?
Future<List<MusicItem>> GetAllMusicItems() async {
List<MusicItem> ret = [];
ret = (userDocSnapShot!['MusicItems'] as List<dynamic>)
.map((e) => MusicItem.fromMap(e))
.toList();
return ret;
}
Future<void> UpdateMusicItem(MusicItem newItem) async {
DocumentReference docRef = userDocSnapShot!.reference;
await GetAllMusicItems().then((musicItems) {
if (!musicItems.isEmpty) {
Logger().d(
" === UpdateMusicItem productList length ${musicItems.length} ==== newItem Name ${newItem.name} ");
MusicItem? oldItem =
musicItems.firstWhere((product) => product.name == newItem.name);
if (oldItem != null) {
Logger().d(" === updatedProduct ${oldItem!.name} ==== ");
docRef.update({
'MusicItems': FieldValue.arrayRemove([oldItem!.toMap()])
});
docRef.update({
'MusicItems': FieldValue.arrayUnion([newItem.toMap()])
});
}
} else {
Logger().d(" === UpdateMusicItem ==== ");
}
});
}
1条答案
按热度按时间uplii1fm1#
无法更新数组字段中的现有项。您可以自动地将项目添加到列表中,或从列表中删除项目,但要更新项目,您需要:
1.从数据库中读取现有阵列
1.在应用程序代码中更新内存中的数组
1.将整个数组字段写回数据库