当前位置: 首页 > 面试题库 >

SwiftUI:删除所有核心数据实体条目后,列表不会自动更新

云凌
2023-03-14
问题内容

我知道SwiftUI使用状态驱动的渲染。所以我以为,当我删除核心数据实体条目时,带有核心数据元素的列表会立即刷新。我使用以下代码,成功清除了我的实体:

func deleteAll()
{
    let fetchRequest: NSFetchRequest<NSFetchRequestResult> = ToDoItem.fetchRequest()
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer

    do {
        try persistentContainer.viewContext.execute(deleteRequest)
    } catch let error as NSError {
        print(error)
    }
}

要使我的视图中的列表视觉上是空的,我必须事后离开视图(例如,使用“
self.presentationMode.wrappedValue.dismiss()”)并再次打开它。好像这些值仍存储在内存中的某个地方。当然这不是用户友好的,我敢肯定,我只是监督着可以立即刷新列表的内容。也许有人可以帮忙。


问题答案:

原因是execute(如以下详细描述-注意第一句话)不会影响托管对象的上下文,因此所有获取的对象都保留在上下文中,UI表示上下文真正呈现的内容。

因此,通常,在执行此批量操作后,您需要通知该代码(此处未提供)强制同步并重新获取所有内容。

API接口声明

// Method to pass a request to the store without affecting the contents

of the managed object context.
// Will return an NSPersistentStoreResult which may contain additional
information about the result of the action
// (ie a batch update result may contain the object IDs of the objects
that were modified during the update).
// A request may succeed in some stores and fail in others. In this
case, the error will contain information
// about each individual store failure.
// Will always reject NSSaveChangesRequests.
@available(iOS 8.0, *)
open func execute(_ request: NSPersistentStoreRequest) throws ->
NSPersistentStoreResult


例如,可能是以下方法(抓抓)

// somewhere in View declaration
@State private var refreshingID = UUID()

...
// somewhere in presenting fetch results
ForEach(fetchedResults) { item in
    ...
}.id(refreshingID) // < unique id of fetched results

...

// somewhere in bulk delete 
try context.save() // < better to save everything pending
try context.execute(deleteRequest)
context.reset() // < reset context
self.refreshingID = UUID() // < force refresh


 类似资料:
  • 问题内容: 对于如何迅速删除所有核心数据,我有些困惑。我创建了一个带有链接的按钮。单击按钮后,我将看到以下内容: 然后,我想出了各种方法来尝试删除所有核心数据内容,但似乎无法正常工作。我已经使用removeAll从存储的数组中删除,但是仍然不能从核心数据中删除。我假设我需要某种类型的for循环,但是不确定如何从请求中进行。 我尝试应用删除单行的基本原理 但是,这样做的问题是,当我单击按钮时,我没有

  • 我有一个使用rowedit的p:datatable,可以正常工作,但是当您删除一个条目时,datatable没有更新。 xhtml

  • 问题内容: 不幸的是,新的Core Data语义使我发疯。我之前的问题有一个干净的代码,因为头文件的自动生成不正确,因此无法正常工作。现在,我继续删除对象的工作。我的代码似乎很简单: 我用代替进行了“硬”调试,它向我展示了正确的对象。所以我只需要删除它。 PS没有。现在NSManagedContext只有 问题答案: 在您的情况下,提取的结果是托管对象 的 数组,因此您可以枚举该数组并删除所有匹配

  • SQLAlchemy 1.4 / 2.0 Tutorial 此页是 SQLAlchemy 1.4/2.0教程 。 上一次: 使用核心或ORM选择行 |下一步: |next| 使用核心更新和删除行 到目前为止,我们已经讨论过 Insert ,这样我们就可以将一些数据放入我们的数据库中,然后花费大量时间在 Select 其处理用于从数据库检索数据的广泛的使用模式。在本节中,我们将介绍 Update 和

  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。