ios找不到NSManagedObjectModel,NSInternalConsistencyException

时间:2011-10-23 14:09:36

标签: ios nsmanagedobjectcontext

我知道有类似的问题已被问到,但他们都有不同的答案,似乎没有人帮助我。

所以,我有一个叫做TherapistScheduler的应用程序,它在项目根目录的/ Data文件夹中有一个therapistScheduler.xcdatamodel。在该文件夹中是Session.h和Session.m文件,它与我的数据模型中的Session实体相匹配。

我的app委托中包含 managedObjectContext managedObjectModel persistantStoreCoodinator 等函数。

在我的applicationDidFinishLaunching方法中,我在rootViewController(这是一个tabBarController)的顶部添加了一个视图控制器(loginViewController),我正试图从那里访问我的Session实体。

我正在使用以下代码尝试保存值 - 这会引发错误:

  // create session 
Session *session = (Session *) [NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:self.managedObjectContext];  
[session setSessionHash:strUserhash]; 

loginViewController.h文件包含:

NSManagedObjectContext *managedObjectContext; // in the interface declaration

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; // after the interface

loginViewController.m文件包含

@synthesize managedObjectContext;

我是否需要在loginViewController viewDidLoad中执行某些操作来初始化managedObjectContext?关于这一切是如何运作的,我有点迷茫。我希望能够从我在标签栏上切换到的任何视图中访问存储在managedObjectContext中的数据。

我知道我可能需要在问题中添加更多代码,但我不知道还需要什么。

我得到的错误是:

TherapistScheduler[40752:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Session''
*** Call stack at first throw:
(
0   CoreFoundation                      0x02581919 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x0295b5de objc_exception_throw + 47
2   CoreData                            0x0004525b +[NSEntityDescription entityForName:inManagedObjectContext:] + 187
3   CoreData                            0x0007cd8b +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:] + 59
4   TherapistScheduler                  0x000030ce -[LoginViewController processLoginForUserhash:andType:] + 142
5   TherapistScheduler                  0x000039fa -[LoginViewController connectionDidFinishLoading:] + 330
6   Foundation                          0x01f91666 -[NSURLConnection(NSURLConnectionReallyInternal) sendDidFinishLoading] + 108
7   Foundation                          0x01f915bf _NSURLConnectionDidFinishLoading + 133
8   CFNetwork                           0x02b8d9f1 _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 285
9   CFNetwork                           0x02c56c72 _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 402
10  CFNetwork                           0x02c570ea _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 1546
11  CFNetwork                           0x02c570ea _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 1546
12  CFNetwork                           0x02b82dfe _ZN19URLConnectionClient13processEventsEv + 100
13  CFNetwork                           0x02b82c95 _ZN17MultiplexerSource7performEv + 247
14  CoreFoundation                      0x02562d7f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
15  CoreFoundation                      0x024c11dd __CFRunLoopDoSources0 + 333
16  CoreFoundation                      0x024c07c6 __CFRunLoopRun + 470
17  CoreFoundation                      0x024c0280 CFRunLoopRunSpecific + 208
18  CoreFoundation                      0x024c01a1 CFRunLoopRunInMode + 97
19  GraphicsServices                    0x02de62c8 GSEventRunModal + 217
20  GraphicsServices                    0x02de638d GSEventRun + 115
21  UIKit                               0x00215b58 UIApplicationMain + 1160
22  TherapistScheduler                  0x00001f3d main + 125
23  TherapistScheduler                  0x00001eb5 start + 53
24  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'

2 个答案:

答案 0 :(得分:0)

我不得不将managedObjectContext称为app delegate的属性而不是self。所以它看起来像appDelegate.managedObjectContext

答案 1 :(得分:0)

当你通过managedObjectContext时,我认为你所做的是这样的:

TimelineTableViewController * timelineTableViewController;
timelineTableViewController = [TimelineTableViewController alloc];
[timelineTableViewController initWithStyle:UITableViewStylePlain];
timelineTableViewController.managedObjectContext = self.managedObjectContext;
//...

然后在TimelineTableViewController的{​​{1}}方法中,您希望按viewDidLoad:获取数据,是吗?

我调试了这个问题,发现managedObjectContext的{​​{1}}将比TimelineTableViewController(从父级(或AppDelegate)传递给adminObjectContext到子级)更快地发送。因此,当您尝试获取数据时,viewDidLoad:实际上是timelineTableViewController.managedObjectContext = self.managedObjectContext;。这就是你遇到这个问题的原因:

  

'+ entityForName:无法找到实体名称'Session'的NSManagedObjectModel'


替代方法:

您需要做的是确保在需要获取数据时managedObjectContext不是nil:

nil

我刚刚通过这种方式解决了这个问题(不需要直接使用AppDelegate的managedObjectContext)。