Daten werden nicht in Kerndaten gespeichert

Ich verwende Xcode 5, das ausschließlich für iOS 7 kompiliert.

Ich lese Daten aus einer UTF8-TXT-Datei, um eine Kerndatenentität zu füllen. Nachdem ich die Daten gelesen habe, logge ich sie in die Konsole ein. Die Daten sind da. Ich fülle die Entität auf und protokolliere die Entität in der Konsole. Ich speichere es. Kein Fehler. Kein Unfall.

Ich sehe 3 Dateien auf dem Gerät:

MyDatabase.sqliteMyDatabase.sqlite-shmMyDatabase.sqlite-wal

Wenn die App startet undMyDatabase.sqlite ist leer angelegt hat es 40 kb. An dieser Stelle wird dieshm Datei ist 32kb und diewal Datei ist Null.

Nachdem ich die Daten in die Datenbank geschrieben habe, wird diewal Dateien werden 1,7 MB groß, aber die anderen beiden Dateien behalten ihre ursprüngliche Größe bei, dh, die Daten werden nicht in der Datenbank gespeichert. Ich habe dies bestätigt, indem ich die SQLite-Datei mit einem externen Datenbank-Viewer überprüft habe.

Dies ist der Code, den ich benutze:

// NSArray *arrayOfYears = ... 
// this contains an array of numbers read from the CSV file
// at this point the array contains numbers in text format

// NSArray *arrayOfBrands = ...
// this is an array of brands

for (int i=0; i<[arrayOfBrands count]; i++) {

            Cars *car = [NSEntityDescription insertNewObjectForEntityForName:@"Cars" inManagedObjectContext:context];

            car.brand = [arrayOfBrands objectAtIndex:i];
            car.year = [NSNumber numberWithInt:[[arrayOfYears objectAtIndex:i] integerValue]];

            NSError *error = nil;
            if (![context save:&error]) {
                // Handle the error.
                NSLog(@"error = %@", error);
            }
}

Dies erzeugt keinen Fehler oder Absturz. Es geht so, als ob es gespart hätte. Ich habe mein SQL-Debug-Level auf 3 erhöht und das sehe ich auf der Konsole ...

wenn die Tabelle leer ist

CoreData: annotation: Connecting to sqlite database file at "/var/mobile/Applications/BB22334C4-550A-4C44-B17A-3F02062EC687/Documents/MyDatabase.sqlite"
CoreData: annotation: creating schema.
CoreData: sql: pragma page_size=4096
CoreData: sql: pragma auto_vacuum=2
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: CREATE TABLE ZCARS ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZYEAR INTEGER, ZBRAND VARCHAR ) 
CoreData: annotation: Creating primary key table.
CoreData: sql: CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER)
CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(1, 'Cars', 0, 0)
CoreData: sql: CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB)
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: DELETE FROM Z_METADATA WHERE Z_VERSION = ?
CoreData: details: SQLite bind[0] = 1
CoreData: sql: INSERT INTO Z_METADATA (Z_VERSION, Z_UUID, Z_PLIST) VALUES (?, ?, ?)
CoreData: details: SQLite bind[0] = 1
CoreData: details: SQLite bind[1] = "C6E2268B-6792-4298-B292-5025E5BDE31A"
CoreData: details: SQLite bind[2] = <NSData len=455>
CoreData: annotation: Saving new meta data; version = 1 ; UUID = C6E2268B-6792-4298-B292-5025E5BDE31A
CoreData: sql: COMMIT
CoreData: sql: pragma journal_mode=wal
CoreData: sql: pragma journal_mode=wal
CoreData: sql: pragma cache_size=200
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA

nach dem Speichern einer Marke / Jahr

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: annotation: getting max pk for entityID = 4
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
CoreData: annotation: updating max pk for entityID = 4 with old = 0 and new = 1
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZTABULEIRO(Z_PK, Z_ENT, Z_OPT, ZYEAR, ZBRAND) VALUES(?, ?, ?, ?, ?)
CoreData: details: SQLite bind[0] = (int64)1
CoreData: details: SQLite bind[1] = (int64)4
CoreData: details: SQLite bind[2] = (int64)1
CoreData: details: SQLite bind[3] = "FORD"
CoreData: details: SQLite bind[4] = (int64)1989
CoreData: sql: COMMIT
CoreData: annotation: Changing objectID 0x14e71730 <x-coredata:///Cars/t38FA86EE-4124-4FD7-A8C0-8CE7BBAC73782> to 0x14e73ef0 <x-coredata://C6E3368B-6792-4298-B292-5025E5BDE31A/Cars/p1>
CoreData: sql: pragma page_count
CoreData: annotation: sql execution time: 0.0014s
CoreData: sql: pragma freelist_count
CoreData: annotation: sql execution time: 0.0016s

Eine seltsame Sache, die ich hier sehe, ist die Jahresvariable wie int64, wenn ich sie wie Integer 16 definiert habe. Warum sie Integer 64 verwendet, ist mir ein Rätsel ...

Die Daten werden überhaupt nicht gespeichert. Die Daten sind da. Wenn ich die Datenfelder auf der Konsole protokolliere, werden die Daten angezeigt. Wenn ich die Entitäten protokolliere, die vor dem Speichern ausgefüllt wurden, werden die Daten angezeigt.

Ich teste dies auf einem Gerät mit iOS 7. Danke.

Was vermisse ich? Wie kann ich das debuggen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage