4

Я просто попытался использовать основные данные, чтобы что-то сделать, моя цель - создать объект с дочерним контекстом, назначить значения для объекта и затем сохранить его на хранение после выполнения некоторых операций ,Ошибка CoreData на устройстве, но прекрасная на симуляторе

Он отлично работает на симуляторе, но при работе на устройстве произошла ошибка.

Это ошибка:

CoreData: error: Mutating a managed object 0x174033540 (0x1740cb600) after it has been removed from its context.

мой код:

Extestion

extension NSManagedObject { 
    class func GV_New() -> NSManagedObject { 
     let entity = self.MR_entityDescription(); 
     let parentContext = NSManagedObjectContext.MR_defaultContext(); 
     let childContext = NSManagedObjectContext.MR_contextWithParent(parentContext); 

     let managedObject = NSManagedObject(entity: entity, insertIntoManagedObjectContext: childContext); 

     return managedObject; 
    } 

    class func GV_Insert(object: NSManagedObject) -> Bool { 
     var result: Bool = false; 

     let keyPath = "userInfo.primaryKey"; 
     let primaryKey = self.MR_entityDescription().valueForKeyPath(keyPath) as String!; 

     if primaryKey != nil { 
      if (self.MR_findFirstByAttribute(primaryKey, withValue: object.valueForKey(primaryKey)) != nil) { 
       result = false; 
      } else { 
       let managedObjectId = object.objectID; 
       let managedObjectContext = object.managedObjectContext; 
       let managedObject = managedObjectContext!.existingObjectWithID(managedObjectId, error: nil); 
       managedObject?.managedObjectContext?.MR_saveOnlySelfAndWait(); 
       NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait(); 

       result = true; 
      } 
     } 
     return result; 
    } 
} 

ViewController

class ViewController: UIViewController { 
    var camera: Camera!; 
    override func viewDidLoad() { 
     super.viewDidLoad(); 

     println("\(Camera.MR_countOfEntities())"); 

     camera = Camera.GV_New() as Camera; 
     camera.camera_id = 4567; 
     Camera.GV_Insert(camera); 

     println("\(Camera.MR_countOfEntities())"); 

     for (index, value) in enumerate(Camera.MR_findAll()) { 
      let result = value as Camera; 
      println("result: \(value.camera_id)"); 
     } 
    } 
} 

ответ

1

просто решить эту проблему,

Я не сохраняю дочерний контекст, так как переменные swift не поддерживаются, но

просто установите managedContext на файл.

let managedContext = NSManagedObjectContext.MR_context();

let managedContext = NSManagedObjectContext.MR_context(); 

extension NSManagedObject { 

    class func GV_New() -> NSManagedObject { 

     return self.MR_createInContext(managedContext) as NSManagedObject; 

    } 

    class func GV_Insert(object: NSManagedObject) -> Bool { 

     var result: Bool = false; 

     let keyPath = "userInfo.primaryKey"; 

     let primaryKey = self.MR_entityDescription().valueForKeyPath(keyPath) as String!; 

     if primaryKey != nil { 

      if (self.MR_findFirstByAttribute(primaryKey, withValue: object.valueForKey(primaryKey)) != nil) { 

       result = false; 

      } 

      else { 

       object.managedObjectContext?.MR_saveOnlySelfAndWait(); 

       NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait(); 

       result = true; 

      } 

     } 

     return result; 

    } 

} 
+0

Не уверен, что я понимаю ваш ответ или почему это работает. –

+0

вам это не нужно, если вы использовали MagicalRecord 3.0 – PatrickSCLin

Смежные вопросы