Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)

Posted

技术标签:

【中文标题】Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)【英文标题】:Flutter & Firebase: Remove Item(Map) from Array in firebase 【发布时间】:2020-09-11 11:39:02 【问题描述】:

我目前正在努力从 firebase 的列表中删除地图项。 例如。我想从列表中删除项目“0”(完全)。

我通过 FieldValue.arrayUnion 使用 updateData 方法将单个数组项添加到另一个地方。这工作得很好。然后,在我的另一个地方,我希望有可能从列表中删除该项目。我通过 StreamBuilder 加载数据并通过 ListView.builder 显示 ListTiles。现在我试图用arrayRemove替换arrayUnion,但它不起作用,我不知道为什么。 这是我的代码:

onPressed: () async 
  try 
    await Firestore.instance
        .collection('users')
        .document(futSnap.data.uid)
        .collection('trainings')
        .document(widget.trainingID)
        .updateData(
      
        'trainingTitle': widget.trainingTitle,
        'trainingID': widget.trainingID,
        'trainingDate': widget.trainingDate,
        'category': widget.trainingCategory,
        'trainingExercises':
            FieldValue.arrayRemove(
          [
            
              'title': trainingExercises[i]
                  ['title'],
              'description':
                  trainingExercises[i]
                      ['description'],
              'imageURL': trainingExercises[i]
                  ['imageUrl'],
              'repetitions':
                  trainingExercises[i]
                      ['repetitions'],
            ,
          ],
        )
      ,
    );
   catch (e) 
    print(e);
  
,

我没有收到任何错误或其他东西。仍然是颤振和编程的初学者,因此非常感谢您的帮助:)

【问题讨论】:

嘿 MaxS。传递给FieldValue.arrayRemove(...) 的值与数据库中存储的值完全相同,这一点非常重要。您能否在此调用之前 print 所有值,并将更新后的代码及其输出包含在您的问题中。 【参考方案1】:

Firestore 不提供任何按索引处理数组内容的方法。如果要从数组中删除地图,您必须知道要移动的数组的全部内容(地图的每个字段的准确值)并使用FieldValue.arrayRemove() 将其删除。如果我不得不猜测,我会说您实际上并没有提供所有 exact 值,因为我们看不到您正在使用的变量的值。

如果您没有所有确切的值,则必须读取整个文档,修改内存中的数组,然后将数组字段写回文档。

【讨论】:

FieldValue.arrayRemove(...) 的调用似乎包含要删除的项目的所有属性,因此据我所知,OP 并未尝试按索引删除项目。 @FrankvanPuffelen 问题是我们无法保证它们传递了所有准确值。 同意没有保证,但很明显 OP 正在尝试在此处正确使用FieldValue.arrayRemove(...)【参考方案2】:

感谢您的回复,在进一步尝试中,现在看来这确实有效:

onPressed: () async 
                              try 
                                await Firestore.instance
                                    .collection('users')
                                    .document(futSnap.data.uid)
                                    .collection('trainings')
                                    .document(widget.trainingID)
                                    .updateData(
                                  
                                    'trainingExercises':
                                        FieldValue.arrayRemove(
                                      [trainingExercises[i]],
                                    )
                                  ,
                                );
                               catch (e) 
                                print(e);
                              
                            ,

但公平地说,我不完全理解为什么,因为我的理解和你的一样,信息必须与整个地图匹配..?我很高兴它有效,但如果能理解为什么会很棒:D

【讨论】:

【参考方案3】:
List<ExpenseData> deleteExpenseData = [];
       deleteExpenseData.add(spendingDetailMapList[documentIndex][documentId[documentIndex]][spending]);
       
        expenseCR.doc(documentId[documentIndex]).update("spending": FieldValue.arrayRemove([deleteExpenseData[0].toJson()],));

我做了这个并且它有效。

【讨论】:

以上是关于Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:Fire Base 存储图像上传的后期初始化错误

我是 Flutter Web 的新手,如何使用 Firebase 电话身份验证对用户进行身份验证,有没有办法让用户保持登录状态?

如何在flutter中使用firebase登录谷歌时检查用户是新用户还是现有用户?

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)

如何清除 Firebase 存储?