0

Я не уверен, что происходит не так. У меня есть одна Entity в моей модели данных, называемая Quote, и около 3000 из них хранятся в .sqlite. Я просто пытаюсь получить один из атрибутов этих объектов в ячейках UITableView, используя NSFetchedResultsController. Ошибка я получаю на эту строку кода:NSFetchedResultsController, кажется, вставляет пустые объекты в массив?

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

кажется, что проблема заключается в том, что он пытается загрузить пустой объект в массив. Я предполагаю, что это означает, что он не нашел объекты внутри файла .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; 
} 
+1

Вы должны установить 'cacheName: nil' вместо пустой строки, если вы не хотите использовать кеш. (И вам это не нужно, потому что у вас нет секций) –

+0

Это не имело никакого значения, но спасибо, не заметили, что :) – Luke

ответ

1

Вы пытались установить ключ (имя атрибута вашей модели) для sortDescriptor? Я думаю, что это проблема.

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

Ты король, добрый сэр! :) – Luke

+0

@ lukech Добро пожаловать;) – Kjuly

+0

И, пожалуйста, не направьте предложение @ MartinR, он прав. – Kjuly