我知道有类似的问题已被问到,但他们都有不同的答案,似乎没有人帮助我。
所以,我有一个叫做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'
答案 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)。