核心数据持久存储协调器NSURL错误

时间:2011-08-26 04:58:54

标签: iphone

我一直致力于开发一款能够让用户评价情绪的应用。我正在使用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方法交互,所以我不想愚弄那些代码。任何帮助将不胜感激。另外,如果我遗漏了您可能需要的任何信息,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:0)

通常情况下,我遇到了这个问题并遇到managedObjectContext为零时出现此错误...为了解决这个问题,我使用了下面的代码并且对我来说很好..

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