1

私が持っている:@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ブックの例から正確にコピーされています。

http://developer.apple.com/library/ios/#samplecode/CoreDataBooks/Listings/Classes_RootViewController_m.html#//apple_ref/doc/uid/DTS40008405-Classes_RootViewController_m-DontLinkElementID_14

上記の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ではありません。今、何も触れずに。永続ストアに何も挿入、更新、または削除するのではなく、アプリケーションをすばやく実行します。この場合、デバッガーの停止ボタンを押します。先に進んでアプリを再起動すると、すべてが美しく入ります。アプリが起動するたびにデータを挿入するのではなく、テストし、データがすでに存在する場合は、データを挿入せずに先に進みます。

ここで何が起こっているのか誰かが知っていますか?

4

0 に答える 0