избавиться от временно сохраненного managedObjectContext

как я могу управлять временно сохраненными CoreData? как только я сделаю что-то вроде этого:

var myClass: MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!) as MyClass

он является частью моего managedObjectContext и будет сохранен, когда я сделаю context.save(nil). Есть ли способ получить объект класса NSManagedObject, не вмешиваясь в мой текущий контекст. Другими словами: я хочу иметь необязательные объекты, которые просто перестают использоваться, когда я не сохраняю их явно, и я хочу иметь объекты, которые я действительно хочу постоянно сохранять.


person iVentis    schedule 10.11.2014    source источник


Ответы (3)


Этот ответ запоздал, но, надеюсь, поможет кому-то еще. Да, есть. Вы создаете дочерний контекст. Делай там все, что хочешь. Если вы хотите сохранить свои изменения, сохраните дочерний контекст, который НЕ сохраняет данные. Он уведомляет родительский контекст об изменениях, изменения теперь находятся в вашем основном контексте. Затем вы можете выполнить сохранение в основном контексте.

    let childContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    childContext.parentContext = mainContext
    guard let myClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: childContext) as? MyClass else {
        // something went wrong, handle it here
        return
    }
    // do your thing here

чтобы основной контекст знал, что вы хотите сохранить свои изменения:

    do {
        try childContext.save()  // does not persist anything, just lets know the parent that we are happy with the changes
    } catch {
        // handle error
    }

если вы хотите НЕ сохранять свои изменения, вы можете выполнить сброс:

    childContext.reset()

когда вы хотите сохранить изменения в основном контексте, вы делаете как всегда:

    do {
         try mainContext.save()
    } catch {
         // handle error
    }
person oyalhi    schedule 01.09.2016
comment
Большое вам спасибо ... точный ответ, сколько мне нужно. - person Hardik Thakkar; 21.08.2019

Нет прямого способа избавиться от обновленного объекта, что вы можете сделать, это снова обновить его реальными данными (которые являются предыдущими данными перед обновлением). всякий раз, когда вы обновляете объект NSManagedObject (объект сущности основных данных), NSManagedObjectContext фиксирует все изменения и сохраняет их всякий раз, когда вы сохраняете контекст.

В этом типе использования лучше использовать базу данных Sqlite.

person Jignesh Agola    schedule 12.11.2014
comment
спасибо за Ваш ответ! что именно вы имеете в виду, когда снова обновляете его реальными данными? - person iVentis; 14.11.2014
comment
не сохраняйте контекст, если вы не хотите сохранять данные, но все же, если вы хотите сохранить контекст, потому что вы могли создать новую сущность. но перед сохранением контекста обновите обновленный объект исходными данными (которые являются настоящими данными). - person Jignesh Agola; 14.11.2014
comment
Но как мне обновить объект? А что за объект ты имеешь ввиду ?? - person iVentis; 14.11.2014

Вы можете удалить объекты из управляемого контекста перед вызовом context.save, что предотвратит их фиксацию. Предположим, у вас есть NSManagedObjectContext с именем context и экземпляр MyClass с именем myClass, тогда будет работать следующее:

context.deleteObject(myClass)

Видеть:

NSManagedObjectContext.deleteObject

Обсуждение

... Если объект еще не был сохранен в постоянное хранилище, он просто удаляется из получателя.

Конечно, решение о том, какие объекты сохранить, а какие отбросить, зависит от логики вашего приложения. Поэтому перед вызовом save вам необходимо проверить все вставленные, но еще не зафиксированные экземпляры, зарегистрированные в используемом вами NSManagedObjectContext. Вы можете отслеживать это в своем приложении, или, возможно, это будет полезно:

NSManagedObjectContext.insertedObjects

Набор объектов, которые были вставлены в приемник, но еще не сохранены в постоянном хранилище. (только для чтения)

person Brett    schedule 15.11.2014