【问题标题】:How to confirm core data execution如何确认核心数据执行
【发布时间】:2017-01-08 14:48:47
【问题描述】:

我正在尝试确认核心数据中的所有数据是否已通过以下来源删除(其中“CoreDataHelper.getCoreDataHelper().context”为 NSManagedObjectContext)

public static func delete(predicates: [NSPredicate] = []) {
    let fetchRequest = request(predicates: predicates)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    do {
        let result1 = try CoreDataHelper.getCoreDataHelper().context.fetch(fetchRequest)
        NSLog("Delete batch size: %d", result1.count)
        let result2 = try CoreDataHelper.getCoreDataHelper().context.execute(deleteRequest)
        NSLog("Delete request succeeded: %d", result2)
    } catch {
        NSLog("Delete request failed")
        return
    }
}

当我测试它时,日志中会显示以下内容

删除批量大小:1

删除请求成功:250432

但是当我真正看到数据时,它似乎并没有被删除。 我尝试添加数据,因为发生数据已在核心数据中的错误。

public static func add(from object: Dictionary<String, Any>) -> NSManagedObjectProtocol? {
    let exists = fetch(id: object)
    if exists.count > 0 {
        NSLog("Object already exists in CoreData : %@", object.description)
        return nil
    } else {
        return newObject(object: object) as NSManagedObjectProtocol
    }
}

对象已存在于 CoreData 中: ....

所以我的问题是我如何知道 NSBatchDeleteRequest 的执行功能正常工作。有没有返回值可以用来确认执行是否没有错误?

【问题讨论】:

    标签: swift core-data swift3


    【解决方案1】:

    删除后保存您的NSManagedContext

    public static func delete(predicates: [NSPredicate] = []) {
        let fetchRequest = request(predicates: predicates)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            ...
            let result2 = try CoreDataHelper.getCoreDataHelper().context.execute(deleteRequest)
            //save context
            try CoreDataHelper.getCoreDataHelper().context.save()
        } catch {
            NSLog("Delete request failed")
            return
        }
    }
    

    【讨论】:

    • 不是每次删除请求都必须保存上下文吗?无论保存操作如何,核心数据都应该能够知道数据的状态。
    • 顺便说一句,有些测试用例成功删除了数据,有些则没有。所以我仍然需要知道删除的结果是否成功,或者至少知道有多少行受到影响。
    • 我们需要更多地了解您的核心数据堆栈以提供进一步帮助。
    • 似乎我必须在创建新对象时保存上下文。
    • 这取决于您的核心数据堆栈。 IE。如果您使用多个上下文,如何设置它们以相互交互(父/子上下文,上下文上的自动MergesChangesFromParent 设置...)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2019-03-22
    相关资源
    最近更新 更多