【问题标题】:CoreStore create object in context without saving to databaseCoreStore 在上下文中创建对象而不保存到数据库
【发布时间】:2019-05-02 11:19:29
【问题描述】:

我要解决下一个问题:

我想在上下文中使用一些 NSManagedObject 并在运行时更改一些属性,但不告诉 SQLite 其中的任何更改。

我只想在点击保存按钮或类似按钮时将NSManagedObject 保存到数据库中。

正如我从源代码演示中发现的那样,我们需要为此目的使用 beginUnsafe(也许我错了)

func unstoredWorkout() -> WorkoutEntity {

    let transaction = CoreStore.beginUnsafe()
    let workout = transaction.create(Into<WorkoutEntity>())

    return workout
}

let workout = unstoredWorkout()
workout.muscles = []

现在当我尝试更新 workout.muscles = [] 应用程序崩溃并出现错误:

error: Mutating a managed object 0x600003f68b60 <x-coredata://C00A3E74-AC3F-47FD-B656-CA0ECA02832F/WorkoutEntity/tC3921DAE-BA43-45CB-8271-079CC0E4821D82> (0x600001c2da90) after it has been removed from its context.

我的问题是我们如何在不保存的情况下创建对象,以及当我们修改某些属性并避免这种崩溃时如何保存它。

【问题讨论】:

    标签: ios swift core-data corestore


    【解决方案1】:

    崩溃的原因是您的事务只存在于您的 unstoredWorkout() 方法中,因此它调用了 deinit,它重置了上下文(并删除了所有未保存的对象)。 您必须在某处保留该不安全事务以使您的对象保持活动状态 - 例如在最终将保存更改的视图控制器中。

    但如果你真的想这样做,我宁愿鼓励你考虑一下。您可能会在各种上下文或其他异步事务处于活动状态时遇到其他同步问题,例如涉及 API 调用时。

    【讨论】:

    • 好的,我想最好的解决方案是在编辑表单期间使用 Struct 或 NSObject 存储临时值,然后通过其上下文创建或更新 NSManagedObject。我对 CoreStore.perform(async or sync) 将上下文中的所有对象保存到数据库文件中是对的吗?
    • 是的,CoreStore.perform() 总是将更改提交到主上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多