flutter 如何在Firestore中更新数组属性中的值?

afdcj2ne  于 2023-06-30  发布在  Flutter
关注(0)|答案(1)|浏览(170)

在我的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   ==== ");
      }
    });
  }
uplii1fm

uplii1fm1#

无法更新数组字段中的现有项。您可以自动地将项目添加到列表中,或从列表中删除项目,但要更新项目,您需要:
1.从数据库中读取现有阵列
1.在应用程序代码中更新内存中的数组
1.将整个数组字段写回数据库

相关问题