我一直致力于开发一款能够让用户评价情绪的应用。我正在使用Core Data来存储这些数据。最初,我试图存储评级和“成就”字符串。我在Core Data中设置了一个名为“Day”的实体,其属性为date(类型为Date),dailyRating(类型为Int16),dailyAccomp(类型为String)和dailyAccompRating(类型为Int16)。我的应用程序在我的应用程序委托的Core Data persistentStoreCoordinator方法中崩溃,如下所示:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"SelfEsteemBldr.sqlite"];
我给出的错误是
[NSPathStore2 URLByAppendingPathComponent:]:无法识别的选择器发送到实例0x4d6f440。
关于错误如何发生的一些背景可能会有所帮助。
我的主窗口有一个标签栏控制器作为rootViewController。在CD模型的选项卡(LogViewController)中,我在导航控制器中设置了一个tableView控制器。导航栏有一个添加按钮,用于推送基本上具有文本字段的新视图,以便用户可以输入相关数据。在该视图中,有一个带有完成按钮的导航栏。用户完成后,“完成”按钮将变为“保存”按钮。当我点击“保存”按钮时,应用程序崩溃了。 “保存”按钮是ViewDidLoad中的UIButtonItem。这是保存按钮的代码:
UIBarButtonItem *newSaveButton =
[[UIBarButtonItem alloc]
initWithTitle:NSLocalizedString(@"Save", nil)
style:UIBarButtonItemStylePlain
target:self
action:@selector(performAddNewDay:)];
self.saveButton = newSaveButton;
[newSaveButton release];
UIButtonItem中的performAddNewDay方法如下所示:
- (void) performAddNewDay:(id)paramSender{
SelfEsteemBldrAppDelegate *delegate = (SelfEsteemBldrAppDelegate *)
[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext;
NSLog(@"Past init point in PerformAddNewDay");
// Get the values from the text fields
NSInteger dailyRatingAsInteger = [self.textFieldDailyRating.text integerValue];
NSNumber *ddailyRating = [NSNumber numberWithInteger:dailyRatingAsInteger];
NSLog(@"Daily Rating Entered is %@", ddailyRating);
NSString *ddailyAccomplishment = self.textFieldAccomplishment.text;
NSLog(@"Daily Accomplishment Entered is %@", ddailyAccomplishment);
NSInteger dailyAccompRatingAsInteger = [self.textFieldAccomplishmentRating.text integerValue];
NSNumber *ddailyAccompRating = [NSNumber numberWithInteger:dailyAccompRatingAsInteger];
NSLog(@"Daily Accomp Rating Entered is %@", ddailyAccompRating);
// Create a new instance of Day
Day *newDay = [NSEntityDescription
insertNewObjectForEntityForName:@"Day"
inManagedObjectContext:context];
if (newDay != nil){
// Set the properties according to the values we retrieved from the text fields
newDay.dailyAccomp = ddailyAccomplishment;
newDay.dailyRating = ddailyRating;
newDay.dailyAccompRating = ddailyAccompRating;
NSError *savingError = nil;
// Save the new day
if ([context save:&savingError] == YES){
// If successful, simply go back to the previous screen
[self.navigationController popViewControllerAnimated:YES];
} else {
// If we failed to save, display a message
[self
displayAlertWithTitle:NSLocalizedString(@"Saving", nil)
message:NSLocalizedString(@"Failed to save the context", nil)];
}
} else {
// We could not insert a new Day managed object
[self
displayAlertWithTitle:NSLocalizedString(@"New Day", nil)
message:NSLocalizedString(@"Failed To Insert A New Day", nil)];
}
}
我已经注释掉了大部分代码,试图找到有问题的陈述,而且似乎是
**NSManagedObjectContext *context = delegate.managedObjectContext;**
也就是说,如果我评论下面的所有内容并包括此stmnt,应用程序不会崩溃。它没有做任何事情,它只是“等待”(如预期的那样)。如果我取消注释此应用程序,应用程序崩溃。 SelfEsteemBldrAppDelegate也使用#import“SelfEsteemBldrAppDelegate.h”stmnt导入。
同样,我得到的错误是在SelfEsteemBldrAppDelegate.m中的Core Data Stack persistentStoreCoordinator方法中。崩溃发生在以下地方:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"SelfEsteemBldr.sqlite"];
我给出的错误是
[NSPathStore2 URLByAppendingPathComponent:]:无法识别的选择器发送到实例0x4d6f440
那么,毕竟那个,为什么我可能会收到这条消息的任何想法,以及我能做些什么来解决它?据我所知,我不应该与Core Data Stack方法交互,所以我不想愚弄那些代码。任何帮助将不胜感激。另外,如果我遗漏了您可能需要的任何信息,请告诉我。谢谢。
答案 0 :(得分:0)
通常情况下,我遇到了这个问题并遇到managedObjectContext
为零时出现此错误...为了解决这个问题,我使用了下面的代码并且对我来说很好..
if (managedObjectContext == nil) {
managedObjectContext = [(iBountyHunterAppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext];
}