2017-06-16 3 views
0

Ich bin mit CoreData in meiner Anwendung zum Speichern mehrerer Tabellen (fast um 30), es funktioniert gut, aber stürzte zufällig mit dieser Ausnahme:Ausnahme wurde während Core-Datenänderung Verarbeitung gefangen, Versuch, Nil mit UserInfo (null)

[error] error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null) 
CoreData: error: Serious application error. 
Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null) 
2017-06-16 15:05:56.043490+0500 Sales CRM[619:85792] 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil' 
*** First throw call stack: 
(0x1872c6fe0 0x185d28538 0x1872c6f28 0x1871e316c 0x1895c2028 0x1895c1218 0x1895c97d0 0x1895c019c 0x1001d6888 0x1001bb78c 0x1000a43d8 0x1878d034c 0x1878e8048 0x187d95814 0x187cda770 0x187ccab28 0x187d97bb0 0x100f85a10 0x100f932e8 0x100f89634 0x100f95630 0x100f9539c 0x186387100 0x186386cac) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

ich habe viel gesucht, aber die meisten Lösungen in Objective C waren und sogar folgte ich einige der Lösungen, aber nichts davon funktioniert.

Hier ist mein Code:

public class ServiceCalls : NSManagedObject { 
    /* 
    class func getContext() -> NSManagedObjectContext { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 

     let moc = NSManagedObjectContext(concurrencyType:.mainQueueConcurrencyType) 
     let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) 
     privateMOC.parent = moc 

     privateMOC.perform({ 
      do { 
       try privateMOC.save() 
      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 
     }) 
     return appDelegate.persistentContainer.viewContext 
    } 
    */ // tried this but didn't work as well 

    class func getContext() -> NSManagedObjectContext { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     return appDelegate.persistentContainer.viewContext 
    } 

Oben ist mein Kontext, die jedes Mal, wenn ich aus einem der Datenbank jedes Ding speichern aufgerufen wird oder holen. Und unten ist, wie ich in Coredata sparen:

let context = getContext() 
    let entity = NSEntityDescription.entity(forEntityName: "DoctorsDetail_Tbl", in: context) 
    let newDoc = NSManagedObject(entity: entity!, insertInto: context) 

    newDoc.setValue(empid, forKey: "empId") 
    newDoc.setValue(doctorid, forKey: "docId") 



    //save the object 
    do { 
     try context.save() 
     print("saved Doctors in Database yayy!") 

    } catch let error as NSError { 
     print("Could not save \(error), \(error.userInfo)") 
    } catch { 
     let nserror = error as NSError 
     fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
    } 
} 
+0

markieren und als richtig, wenn Sie die Lösung gefunden ..für bessere Anleitung für andere so Benutzer. – vaibhav

+0

@vaibhav Lösung hat nicht funktioniert, hat immer noch das gleiche Problem! –

Antwort

0

Manchmal werden Sie nil Wert in Ihrer Datenquelle immer (empid, doctorid), die Ihr einfügen will in coredata

prüfen nil, bevor Sie Wert eingefügt werden sollen in die Datenbank .

func test() { 
    for (key, value) in self { 
     if let unwrappedValue = value.asOptional { 
      print("Unwrapped value for '\(key)' is '\(unwrappedValue)'") 
     } else { 
      print("Value for '\(key)' is nil") 
     } 
    } 
} 

Verwendet:

var dict: [String: AnyObject?] = [ 
    "key1" : "value1", 
    "key2": nil,    // your program is unexpectedly crashing here 
    "key3": "somevalue" 
] 

dict.test() // calling test fuction 

Filter nil in Array:

extension Array { 
    static func filterNils(array: [T?]) -> [T] { 
     return array.filter { $0 != nil }.map { $0! } 
    } 
} 

verwendet:

var array:[Int?] = [1, nil, 2, 3, nil] 

Array.filterNils(array) 

Hoffe das hilft.

+0

Ich habe es, aber es funktioniert die meiste Zeit perfekt, es stürzt einfach zufällig zufällig ab. –

+0

@Shahtajkhalid, habe deinen Punkt, also schlage ich vor, Sie überprüfen nil Wert jedes Mal in Ihrem Array oder Dict vor dem Einfügen. – vaibhav

+0

@shahtajkhalid, überprüfen Sie meine aktualisierten ans. – vaibhav

Verwandte Themen