NSFetchedResultsController似乎是插入空的对象数组?

我不确定发生了什么问题。 我的数据模型中有一个实体,名为Quote,其中大约3000个存储在.sqlite中。 我只是试图通过NSFetchedResultsController的方式获得这些实体的属性之一到一个UITableView的单元格。 我得到的错误是在这行代码:

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

看来问题在于它试图将一个空对象加载到数组中。 我猜这意味着它没有find.sqlite文件中的对象。 这可能是这样吗? 如果是这样,我该如何开始追查为什么可能呢?

这里有一些代码,如果你需要更多,请问:

从AppDelegate.m:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *nav = (UINavigationController *) self.window.rootViewController; FQQuotesTableViewController *quotesTableViewController = (FQQuotesTableViewController *) [[nav viewControllers] objectAtIndex: 0]; quotesTableViewController.managedObjectContext = self.managedObjectContext; quotesTableViewController.test = @"Hello!"; return YES; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; NSString *storePath = [documentsPath stringByAppendingPathComponent: @"Quotes.sqlite"]; NSURL *storeURL = [NSURL fileURLWithPath: storePath]; if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) { NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Quotes" ofType:@"sqlite"]]; NSError* err = nil; if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) { NSLog(@"Oops, could copy preloaded data"); } } NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; } 

并从我的ViewController.m

 - (void)viewDidLoad { [super viewDidLoad]; NSError *error; if (![self.fetchedResultsController performFetch: &error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return [[_fetchedResultsController sections] count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. id <NSFetchedResultsSectionInfo> secInfo = [[_fetchedResultsController sections] objectAtIndex: section]; return [secInfo numberOfObjects]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; NSManagedObject *blah = [self.fetchedResultsController objectAtIndexPath: indexPath]; cell.textLabel.text = [blah valueForKey: @"quote"]; return cell; } #pragma mark - Fetched Results Controller - (NSFetchedResultsController *) fetchedResultsController { if (_fetchedResultsController != nil) { return _fetchedResultsController; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName: @"Quote" inManagedObjectContext: [self managedObjectContext]]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending: YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; [fetchRequest setFetchBatchSize: 50]; NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: [self managedObjectContext] sectionNameKeyPath: nil cacheName: @""]; self.fetchedResultsController = theFetchedResultsController; _fetchedResultsController.delegate = self; return _fetchedResultsController; } 

你有没有尝试为sortDescriptor设置一个键(你的模型的属性名称)? 我认为这是问题。

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:nil // set key for the descriptor ascending:YES];