1

我有:@interface CMainTableViewController:UITableViewController

在那个类中,我有一个 NSFetchResultController。

我有以下单独的数据管理器类: DB_ManagerSingleton //这里我有一个 UIManagedDocument 创建 DB/持久存储

要打开我的持久存储,我从 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 个 NSManageObjects 放入 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 - 这是我所期望的,但不是在表视图中。现在,什么都不碰。不插入、更新或删除持久存储中的任何内容,我只是快速应用程序。在这种情况下,点击调试器上的停止按钮。当我继续并重新启动应用程序时,一切都很漂亮。我不会在每次应用程序启动时插入数据,我会进行测试,如果数据已经存在,我会继续前进而不插入任何数据。

有谁知道这里发生了什么?

4

0 回答 0