1

I'm using swift 2.0 with Xcode 7. I want to store names from a JSON file in CoreData.

I succeed to save datas in my CoreData model, but after the value number 1272 or 1273, my app crashes.

Here is the code :

for (key,subJson):(String, JSON) in json {
                if let name = subJson["nom"].string {
                    print("key : \(key)")
                    self.savePerson(name)
                }
}

 func savePerson(name: String) {
    let appDelegate =
    UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let entity =  NSEntityDescription.entityForName("Person",
        inManagedObjectContext:
        managedContext)
    let person = NSManagedObject(entity: entity!,
        insertIntoManagedObjectContext:managedContext)
    person.setValue(name, forKey: "name")
    do {
        try AppDelegate().managedObjectContext.save()
    } catch {
        fatalError("Failure to save context: \(error)")
    }
    people.append(person)
}

I tried to see with a breakpoint, and here is the program at the key 1272 or 1273 :

--> [savePerson()] try AppDelegate().managedObjectContext.save()
--> [AppDelegate] lazy var managedObjectContext: NSManagedObjectContext =
--> [AppDelegate][managedObjectContext] let coordinator = self.persistentStoreCoordinator

And here is the crash! I checked and the name does exist, it's not nil. I tried to put a kind of sleep on my code and it's not always at the same moment. Do you think this is a question of speed ?

Else, do you know why ?

The log is :

CoreData: error: (14) I/O error for database at     /.../.../.../SingleViewCoreData.sqlite.  SQLite error code:14, 'unable to open database file'
2015-09-22 23:59:59.774 testAlamofire2[8765:351886] CoreData: error: Encountered exception I/O error for database at /.../.../.../SingleViewCoreData.sqlite.  SQLite error code:14, 'unable to open database file' with userInfo {
NSFilePath = "/.../.../.../.../SingleViewCoreData.sqlite";
NSSQLiteErrorDomain = 14;
} while checking table name from store: <NSSQLiteConnection: 0x7f8e2d677ee0>
2015-09-22 23:59:59.779 testAlamofire2[8765:351886] CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///.../.../.../.../SingleViewCoreData.sqlite options:(null) ... returned error Error Domain=NSCocoaErrorDomain Code=256 "(null)" UserInfo={NSSQLiteErrorDomain=14, NSUnderlyingException=I/O error for database at .../.../.../SingleViewCoreData.sqlite.  SQLite error code:14, 'unable to open database file'} with userInfo dictionary {
NSSQLiteErrorDomain = 14;
NSUnderlyingException = "I/O error for database at /.../.../...SingleViewCoreData.sqlite.  SQLite error code:14, 'unable to open database file'";
}
2015-09-22 23:59:59.780 testAlamofire2[8765:351886] Unresolved error Error Domain=YOUR_ERROR_DOMAIN Code=9999 "Failed to initialize the application's saved data" UserInfo={NSLocalizedDescription=Failed to initialize the application's saved data, NSLocalizedFailureReason=There was an error creating or loading the application's saved data., NSUnderlyingError=0x7f8e2d6772d0 {Error Domain=NSCocoaErrorDomain Code=256 "(null)" UserInfo={NSSQLiteErrorDomain=14, NSUnderlyingException=I/O error for database at /.../.../.../SingleViewCoreData.sqlite.  SQLite error code:14, 'unable to open database file'}}}, [NSLocalizedDescription: Failed to initialize the application's saved data, NSLocalizedFailureReason: There was an error creating or loading the application's saved data., NSUnderlyingError: Error Domain=NSCocoaErrorDomain Code=256 "(null)" UserInfo={NSSQLiteErrorDomain=14, NSUnderlyingException=I/O error for database at /.../.../.../.../SingleViewCoreData.sqlite.  SQLite error code:14, 'unable to open database file'}]

EDIT :

I found this page, I don't know if it helps. (old)

1 Answer 1

1

I think the problem may be because your save statement is creating a new instance of the application delegate, each time you save a new person:

try AppDelegate().managedObjectContext.save()

Try using the same, existing, instance that you use earlier:

try managedContext.save()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.