7

iOS 7 専用の Xcode 5 コンパイルを使用しています。

UTF8 txt ファイルからデータを読み取って、コア データ エンティティに入力しています。データを読み取った後、コンソールにログを記録します。データはそこにあります。エンティティにデータを入力し、エンティティをコンソールに記録します。保存します。エラーなし。クラッシュはありません。

デバイスに 3 つのファイルが表示されます。

  • MyDatabase.sqlite
  • MyDatabase.sqlite-shm
  • MyDatabase.sqlite-wal

アプリが起動しMyDatabase.sqliteて空で作成されると、40 kb になります。この時点で、shmファイルは 32kb で、walファイルはゼロです。

データベースにデータを書き込んだ後、walファイルは 1.7 Mb まで大きくなりますが、他の 2 つのファイルは初期サイズのままです。つまり、データはデータベースに保存されません。外部データベース ビューアで sqlite ファイルを調べることで確認しました。

これは私が使用しているコードです:

// 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);
            }
}

これにより、エラーやクラッシュは発生しません。節約していたようです。mySql デバッグ レベルを 3 に上げました。これがコンソールに表示される内容です...

テーブルが空で作成されたとき

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

1ブランド/年を節約した後

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

ここで奇妙なことの 1 つは、整数 16 のように定義したときに、int64 のような年の変数です。

データはまったく保存されていません。データはそこにあります。データの配列をコンソールに記録すると、データが表示されます。保存する前に入力されたエンティティをログに記録すると、データが表示されます。

iOS 7 を実行しているデバイスでこれをテストしています。ありがとうございます。

私は何が欠けていますか?どうすればそれをデバッグできますか?

4

1 に答える 1