私が持っている:@interface CMainTableViewController:UITableViewController
そのクラスには、NSFetchResultControllerがあります。
次の個別のデータマネージャークラスがあります。DB_ManagerSingleton//ここにDB/永続ストアを作成するUIManagedDocumentがあります
永続ストアを開くには、DB_ManagerSingletonクラスから次の手順を実行します。
UIManagedDocument * fileDB = [[UIManagedDocument alloc] initWithFileURL:url];
if([[NSFileManager defaultManager] fileExistsAtPath:self.fileDB.fileURL.path] != TRUE)
{
[self.fileDB saveToURL:self.fileDB.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success)
{
[self completeDBSetup:success];
}];
}//End if
else if(self.fileDB.documentState == UIDocumentStateClosed)
{
[self.fileDB openWithCompletionHandler:^(BOOL success)
{
[self completeDBSetup:success];
}];
}//End else if
else if(self.fileDB.documentState == UIDocumentStateNormal)
{
[self completeDBSetup:TRUE];
}//End else if
completeDBSetupは、4つのNSManageObjectをNSManagedObjectContextに配置し、永続ストアが開かれたことを登録済みのオブザーバーに通知します。
if([CLevelFactory createLevels] == TRUE)
[self.fileDB.managedObjectContext save:&error];
for(id<DB_StateNotification> observer in self.arrNotificationDelegates)
{
if(observer != nil)
[observer DB_StateChange:self.isDBSetup];
}//End for loop
さて、この場合、オブザーバーは私のTableViewControllerクラスです。このクラス内で、NSFetchedResultsControllerDelegateのすべてのメソッドを実装しました。実装は、Coredataブックの例から正確にコピーされています。
上記のDB_StateChangeメソッドでtableViewコントローラーを設定する方法は次のとおりです。
self.fetchResultController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:dbMgr.fileDB.managedObjectContext
sectionNameKeyPath:@"levelID"
cacheName:nil];
self.fetchResultController.delegate = self;
NSError *error = nil;
self.bQuerierYourData = [self.fetchResultController performFetch:&error];
NSArray *fetchedObjects = [self.fetchResultController fetchedObjects];
//NOTE: I ALWAYS have a count greater than 0. Even on the first run.
if(fetchedObjects.count > 0)
[self.tableView reloadData];
ここで問題となるのは、アプリケーションを初めて起動したときに、テーブルビューでしゃがむことです。fetchedObjects.countが4になります。これは私が期待していることですが、テーブルビューでは'aではありません。今、何も触れずに。永続ストアに何も挿入、更新、または削除するのではなく、アプリケーションをすばやく実行します。この場合、デバッガーの停止ボタンを押します。先に進んでアプリを再起動すると、すべてが美しく入ります。アプリが起動するたびにデータを挿入するのではなく、テストし、データがすでに存在する場合は、データを挿入せずに先に進みます。
ここで何が起こっているのか誰かが知っていますか?