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

不知道我理解你的答案或者爲什麼它的工作原理。 – 2015-07-05 23:44:40

+0

如果你使用的是MagicalRecord 3.0,你不需要這個 – PatrickSCLin 2015-07-06 03:30:09

相關問題