【问题标题】:Cant Get My Table Loaded Using Core Data无法使用核心数据加载我的表
【发布时间】:2011-04-28 23:52:31
【问题描述】:

我已经尝试了几个星期,但似乎无法让它发挥作用。

似乎我修复了一个东西,而其他东西崩溃了,就像一个没有尽头的来回过程。

此表显示每个对象“例程”的实体“锻炼”对象。

我的数据模型:

如果有人看到任何可能导致问题的内容,我只是发布我的完整代码。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.routineTableView.delegate = self;
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(exerciseChooser)];
    self.navigationItem.rightBarButtonItem = addButton;
    [addButton release];

    if (managedObjectContext == nil) 
    { 
        managedObjectContext = [(CurlAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
        [managedObjectContext retain];
    }
    [self loadData];
}

-(void)loadData
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

    NSManagedObject *selectedObject = [entityArray objectAtIndex:indexPath.row];

    //Set Predicate

    NSLog(@"After managedObjectContext: %@",  managedObjectContext);

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
    }
    self.entityArray = mutableFetchResults;

    [request setPredicate: [NSPredicate predicateWithFormat: @"routineExercises = %@", selectedObject]];    

    [mutableFetchResults release];
    [request release];

}
-(void)addExercise
{   
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(exerciseChooser)];
    self.navigationItem.rightBarButtonItem = addButton;
    [addButton release];

    if (managedObjectContext == nil) 
    { 
        managedObjectContext = [(CurlAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
        [managedObjectContext retain];
    }

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
    }

    Exercise *exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];

    exercise.name = selectedExercise;

    NSMutableSet *exercises = [NSSet setWithObjects:exercise,nil];

    Routine *routine = (Routine *)[NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext];

    routine.routineExercises = exercises;    

    if (![managedObjectContext save:&error]) 
    {
        // Handle the error.
    }
    NSLog(@"%@", error);

    [self.routineTableView reloadData];
    [mutableFetchResults release];
    [request release];
}

- (NSFetchedResultsController *)fetchedResultsController
{
    if (fetchedResultsController != nil)
    {
        return fetchedResultsController;
    }

    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercise" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return fetchedResultsController;
}   

更新:更新了 addExercise 方法(但仍然无法正常工作,它崩溃了)

-(void)addExercise
{   
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(exerciseChooser)];
    self.navigationItem.rightBarButtonItem = addButton;
    [addButton release];

    NSError *error = nil;

    Exercise *exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];

    exercise.name = selectedExercise;

    [theSelectedRoutine addRoutineExercisesObject: exercise];

    if (![managedObjectContext save:&error]) 
    {
        // Handle the error.
    }
    NSLog(@"%@", error);

    [self.routineTableView reloadData];

}

【问题讨论】:

  • addExercise 在哪里被调用?为什么要制作 fetch 结果的可变副本以及mutableFetchResults 的用途是什么?
  • 是的,我不需要那里的所有 fetchresults 东西,所以我把它拿出来了。它在另一个显示用户选择的练习的类中被调用。在那个类中调用了 didSelectRow。
  • 我看到你只设置了self.routineTableView.delegate = self; 你也设置了它的数据源吗?并且委托和数据源都从NSFetchedResultsController 获取数据,对吧?
  • 是的,我已经在 IB 和其他东西中设置了数据源,并且全部来自 NSFetchedResultsController。
  • 它在哪里崩溃了?是在表格视图加载后尝试添加数据的时候吗?尝试在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:中将缓存设置为零@

标签: iphone objective-c cocoa-touch core-data


【解决方案1】:

该错误消息的含义是您尝试访问 routine 类中的 routine 属性,但根据您的图表,没有这样的事情!

您应该将Excercise 类中的routineExercises 重命名为routine,并将其设置为Routine 类中routineExercises 的反比关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多