【问题标题】:Core Data and NSEntityDescription核心数据和 NSEntityDescription
【发布时间】:2011-10-22 02:16:10
【问题描述】:

我在 iPhone 应用上遇到了 Core Data 问题。每次我尝试使用 NSEntityDescription 调用方法时,我都会得到一个 objc_exception_throw() (我在符号断点中设置了它)。

我得到异常的部分示例是:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
managedObjectContext = [favoritesFetchedResultsController managedObjectContext];
[request setEntity:[NSEntityDescription entityForName:@"FavoriteAddress" inManagedObjectContext:self.managedObjectContext]];
favorites = [managedObjectContext executeFetchRequest:request error:nil];

managedObjectContext = [recentsFetchedResultsController managedObjectContext];
[request setEntity:[NSEntityDescription entityForName:@"RecentAddress"
                               inManagedObjectContext:managedObjectContext]];
recents = [managedObjectContext executeFetchRequest:request error:nil];

[request release];

“FavoriteAddress”和“RecentAddress”是我的核心数据模型中对象的名称。 favoritesFetchedResultsControllerrecentsFetchedResultsController 都在以下方法中定义:

-(NSFetchedResultsController *)favoritesFetchedResultsController
{
NSLog(@"Favorites Fetched Results Controller called");
if(favoritesFetchedResultsController == nil)
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FavoriteAddress" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"FavoritesCache"];

    aFetchedResultsController.delegate = self;
    self.favoritesFetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [request release];

}

return favoritesFetchedResultsController;
}

-(NSFetchedResultsController *)recentsFetchedResultsController
{
NSLog(@"Recent Fetched Results Controller called");

if(recentsFetchedResultsController == nil)
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"RecentAddress" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"RecentsCache"];
    aFetchedResultsController.delegate = self;
    self.recentsFetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [request release];
}

return recentsFetchedResultsController;
}

抛出异常时我得到的回溯是:

0  0x01703cb4 in objc_exception_throw ()
1  0x00fe6a87 in +[NSEntityDescription entityForName:inManagedObjectContext:] ()
2  0x0001ca7f in -[SavedAddressesViewController getData] (self=0x8173910, _cmd=0x22f72) at /Users/MasonSilber/Desktop/Programming Stuff/iOS Programming/XCode 4/StuffNearMe/StuffNearMe/SavedAddressesViewController.m:40
3  0x0001c93f in -[SavedAddressesViewController initWithStyle:] (self=0x8173910, _cmd=0x6bfe690, style=UITableViewStylePlain) at /Users/MasonSilber/Desktop/Programming Stuff/iOS Programming/XCode 4/StuffNearMe/StuffNearMe/SavedAddressesViewController.m:28
4  0x0039e3b6 in -[UITableViewController init] ()
5  0x00016662 in -[StartPageViewController goToSavedAddresses:] (self=0x815fde0, _cmd=0x2222a, sender=0x852a100) at /Users/MasonSilber/Desktop/Programming Stuff/iOS Programming/XCode 4/StuffNearMe/StuffNearMe/StartPageViewController.m:409
6  0x0156e969 in -[NSObject performSelector:withObject:withObject:] ()
7  0x00176429 in -[UIApplication sendAction:to:from:forEvent:] ()
8  0x003ae993 in -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] ()
9  0x0156e969 in -[NSObject performSelector:withObject:withObject:] ()
10 0x00176429 in -[UIApplication sendAction:to:from:forEvent:] ()
11 0x001763be in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
12 0x0021d45f in -[UIControl sendAction:to:forEvent:] ()
13 0x0021d928 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
14 0x0021cbf3 in -[UIControl touchesEnded:withEvent:] ()
15 0x0019c7b4 in -[UIWindow _sendTouchesForEvent:] ()
16 0x0019c9dd in -[UIWindow sendEvent:] ()
17 0x001820c0 in -[UIApplication sendEvent:] ()
18 0x0017590c in _UIApplicationHandleEvent ()
19 0x01d96876 in PurpleEventCallback ()
20 0x0153fff5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
21 0x014a4902 in __CFRunLoopDoSource1 ()
22 0x014a31ea in __CFRunLoopRun ()
23 0x014a2694 in CFRunLoopRunSpecific ()
24 0x014a25ab in CFRunLoopRunInMode ()
25 0x01d94fdf in GSEventRunModal ()
26 0x01d950a4 in GSEventRun ()
27 0x00173851 in UIApplicationMain ()
28 0x000023ca in main (argc=1, argv=0xbffff5ec) at /Users/MasonSilber/Desktop/Programming Stuff/iOS Programming/XCode 4/StuffNearMe/StuffNearMe/main.m:16

我认为这可能与托管对象上下文有关(我还不太了解它们或核心数据),但我不确定。任何帮助都非常感谢,我很难让它发挥作用。提前致谢。

【问题讨论】:

  • 知道抛出的异常是什么会有所帮助。让执行继续,这样你就可以看到抛出了什么。
  • 哦,对不起,我没有说。这只是一个普通的 SIGABRT,控制台中没有任何消息。
  • 您确认managedObjectContext 是实时的吗?也将NSZombieEnabled 环境变量设置为YES
  • 我已经设置了 NSZombieEnabled,它没有向控制台发送任何通知。

标签: objective-c ios exception core-data


【解决方案1】:

您正在从self.managedObjectContext 设置获取请求的 managedObjectContext,但您正在使用从每个获取结果控制器 managedObjectContext 属性返回的值执行获取请求。

这意味着您可能涉及两个或多个不同的上下文,或者其中一个上下文的值为 nil。由于您从 NSEntityDescription 调用中获得异常,因此 self.managedObjectContext 可能为零。

除非您出于某种原因明确有两个上下文,否则您应该只使用一个对上下文的引用。在这种情况下,您应该始终使用 self.managedObjectContext,注意正确填充它。

【讨论】:

  • 谢谢!托管对象上下文仍然让我感到困惑,但现在我认为我走在了正确的轨道上。它当然没有做我想做的事,但它并没有在那条线上崩溃,所以谢谢!
  • 上下文是为“托管”对象提供“管理”的东西。就像人类经理一样,最好只有一个,这样他们就不会互相干扰。每个线程/操作通常不会有多个上下文。如果一个应用中只有一个线程,那么整个应用通常只有一个上下文。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 2011-01-11
  • 2010-12-04
  • 2014-09-18
  • 2013-01-24
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多