3

NSFetchedResultsControllercoredataを使用してtableViewをロードするために使用しています。最近、ManagedObjectModelに新しいものを追加し、Entity coredata のバージョン管理を行い、軽量の移行を使用しました。

管理対象オブジェクト コンテキスト (MOC) の説明を印刷すると、新しく追加されたスキーマが示され、スキーマも .xml で定義されますNSPersistentStoreCoordinator

私の問題は、新しく作成されたデータにデータを挿入すると、Entity挿入中にエラーがスローされなくてもNSFetchedResultsControllerデリゲートが起動されず、SQL テーブルで実際に挿入が行われていることを確認したことです。

を使用してコアデータの移行が必要かどうかを確認しました

 NSMigrationManager *manager = [[NSMigrationManager alloc]
                               initWithSourceModel:[self sourceModel] destinationModel:[self destinationModel]];




BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType
                                    options:nil withMappingModel:mappingModel toDestinationURL:dstStoreURL
                            destinationType:NSSQLiteStoreType destinationOptions:nil error:outError];

そして、coredata が正しいモデルを自動的に選択し、使用する必要がないことがわかりましたNSMigrationManager

実装するためNSFetchResultsControllerに、Raywenderlich の例に従いました

http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller であり、バージョン管理なしで CoreData で正常に動作していました。

新しいエンティティを追加してバージョン管理を行っNSFetchResultsController delegateた後、最新のエンティティを使用する必要があります。マネージド オブジェクト モデルでは、新しく追加されたエンティティと古いエンティティの間に関係はありません。changed the Current Core Data Model

編集:これが私のフェッチ結果コントローラーの初期化コードです

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"SongDetails" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"songName" ascending:YES];


[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];



[fetchRequest setFetchBatchSize:10];

/*CHECKED WHETHER ANY SONGDETAILS ARE FETCHED*/
NSError * err;
NSArray * results = [managedObjectContext executeFetchRequest:fetchRequest error:&err];
NSLog(@" results >>> %@ ,results);
/* */

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                               cacheName:nil];

self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

return fetchedResultsController;

}

フェッチ結果コントローラーにログを追加した後、次の結果が得られます

 results >>> ("<SongDetails: 0x115abae0> (entity: SongDetails; id: 0x115a94a0 <x-coredata://7E5CDD40-8A4C-455D-8000-34FD70AC8837/SongDetails/p1> ; data: <fault>)",
"<SongDetails: 0x115abe90> (entity: SongDetails; id: 0x115aa450 <x-coredata://7E5CDD40-8A4C-455D-8000-34FD70AC8837/SongDetails/p2> ; data: <fault>)",

以下は、挿入中の SQL デバッガーからの結果です。

2013-03-06 12:09:25.894[6035:c07] CoreData: sql: BEGIN EXCLUSIVE
2013-03-06 12:09:25.895[6035:c07] CoreData: sql: INSERT INTO ZSONGDETAILS(Z_PK, Z_ENT, Z_OPT, ZSONGNAME) VALUES(?, ?, ?, ?)
2013-03-06 12:09:25.902[6035:c07] CoreData: sql: COMMIT

どんな助けでも大歓迎です。

4

1 に答える 1

3

私のコメントから言い換えます。[fecthedResultsController performFetch:&error]FRCがモデルの変更を検出し、そのデリゲートメソッドを呼び出す前に呼び出す必要があります。

于 2013-03-06T06:55:33.720 に答える