0

私はこのデリゲートメソッドを持っています:

- (void)didFinishCreatingTrip:(Trip *)trip
{
    NSLog(@"before");
    NSError* error = nil;
    if (![self.database.managedObjectContext save:&error]) {
        NSLog(@"%@", error);
    }
    NSLog(@"after");
}

このメソッドが呼び出されると、INSERT SQLクエリはすぐには発生しませんが、約10秒後に発生します(コンソールログによる)。これは期待されていますか?それがすぐに起こるようにするにはどうすればよいですか?問題は、iPhoneシミュレーターを早く終了すると、データが失われることです。

ログ:

2012-07-07 23:29:41.702 tripmoney[57542:fb03] before
2012-07-07 23:29:41.703 tripmoney[57542:fb03] after
2012-07-07 23:29:54.948 tripmoney[57542:11407] CoreData: sql: BEGIN EXCLUSIVE
2012-07-07 23:29:54.949 tripmoney[57542:11407] CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
2012-07-07 23:29:54.950 tripmoney[57542:11407] CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
2012-07-07 23:29:54.951 tripmoney[57542:11407] CoreData: sql: COMMIT
2012-07-07 23:29:54.953 tripmoney[57542:11407] CoreData: sql: BEGIN EXCLUSIVE
2012-07-07 23:29:54.954 tripmoney[57542:11407] CoreData: sql: INSERT INTO ZTRIP(Z_PK, Z_ENT, Z_OPT, ZNAME) VALUES(?, ?, ?, ?)
2012-07-07 23:29:54.955 tripmoney[57542:11407] CoreData: sql: COMMIT
2012-07-07 23:29:54.956 tripmoney[57542:11407] CoreData: sql: pragma page_count
2012-07-07 23:29:54.957 tripmoney[57542:11407] CoreData: annotation: sql execution time: 0.0006s
2012-07-07 23:29:54.957 tripmoney[57542:11407] CoreData: sql: pragma freelist_count
2012-07-07 23:29:54.958 tripmoney[57542:11407] CoreData: annotation: sql execution time: 0.0006s
4

2 に答える 2

0

CoreData は、一部のオブジェクトのメモリ内キャッシュを保持することによって機能します。どのファイルを保持するかは少し謎ですが、おそらく最近アクセスしたものをメモリに保持しているので、次に必要になったときにディスクに移動する必要はないと思います。これが、メモリ内コピーが正しい値を返す理由です。あなたの懸念は理解していますが、多くのコアデータ アプリでこれに悩まされたことはありません。あなたが本当に心配なら、あなたにaを追加して、少しの間生き続けてsaveください.applicationDidEnterBackground

于 2012-07-07T21:47:43.327 に答える
0

UIManagedDocument を使用する場合は、単純に保存します。

[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
于 2015-03-11T03:31:46.980 に答える