2

我得到一個煩人模糊錯誤從下面的代碼:爲什麼我無法使用此代碼從委託中獲取上下文?

GFree2AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
context = [delegate managedObjectContext]; 

context被定義爲.h文件一個NSManagedObjectContext,是委託相同。所有正確的文件似乎都包含在內(除了在.m文件中的<CoreData/CoreData.h> - 但程序會拋出相同的問題,無論它是否包含在其中)包含在頭文件中。

所有正確的框架和東西都是包括 - 當我開始項目時,我選擇了「使用coredata來管理數據」或其他任何東西。那麼肯定不應該有問題?

有沒有更好的方法來做我想做的事情?基本上我不想在不同的類中繼續傳遞上下文,直到我最終想要使用它(存儲數據只是我應用程序的一小部分)。

在控制檯中我得到的錯誤是:

2010-08-28 13:09:24.726 GFree2[3912:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' 
... 

    terminate called after throwing an instance of 'NSException' 
    Program received signal: 「SIGABRT」. 

如果我註釋掉行:context = [delegate managedObjectContext];那麼這一切似乎很好地工作。 (目前我還沒有acctually使用,因此那裏有與它沒有更多的代碼,任何coredata或任何

感謝的人誰可以幫助,或者提供一些洞察到這一點 - 。它的那麼複雜

編輯:我的應用程序的委託文件的方法:

#pragma mark - 
#pragma mark Core Data stack 

/** 
Returns the managed object context for the application. 
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
*/ 
- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext != nil) { 
    return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
    managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext; 
} 


/** 
Returns the managed object model for the application. 
If the model doesn't already exist, it is created from the application's model. 
*/ 
- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
    return managedObjectModel; 
    } 

    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"GFree" ofType:@"momd"]; 
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
    return managedObjectModel; 
} 

/** 
Returns the persistent store coordinator for the application. 
If the coordinator doesn't already exist, it is created and the application's store added to it. 
*/ 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"GFree.sqlite"]]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
    /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 

     Typical reasons for an error here include: 
     * The persistent store is not accessible; 
     * The schema for the persistent store is incompatible with current managed object model. 

     Check the error message to determine what the actual problem was. 

     If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory. 

     If you encounter schema incompatibility errors during development, you can reduce their frequency by: 
     * Simply deleting the existing store: 
      [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] 

     * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
      [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

     Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. 

    */ 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
    }  

    return persistentStoreCoordinator; 
} 

#pragma mark - 
#pragma mark Application's Documents directory 

/** 
Returns the path to the application's Documents directory. 
*/ 
- (NSString *)applicationDocumentsDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

再次編輯:

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"GFree" ofType:@"momd"]; 
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 

是行錯誤所在,我不知道這是什麼類型的文件,但我敢肯定,這Ø顯然沒有找到它或什麼......:/任何想法我應該做什麼?

@kiamlaluno - 遺憾地回滾你的編輯,並不意味着,只是好奇,看看你改變了什麼,並認爲這會顯示我......但它只是徹底刪除它們顯然。大聲笑。

編輯生成結果:

DataModelCompile build/Debug-iphonesimulator/GFree2.app/GFree2.mom GFree2.xcdatamodel 
cd "/Volumes/files/Gluten Free Cooking/Tom iPhone App/GFree2" 
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" 
/Developer/usr/bin/momc -XD_MOMC_TARGET_VERSION=10.6 "/Volumes/files/Gluten Free Cooking/Tom iPhone App/GFree2/GFree2.xcdatamodel" "/Volumes/files/Gluten Free Cooking/Tom iPhone App/GFree2/build/Debug-iphonesimulator/GFree2.app/GFree2.mom" 

回答

1

我認爲,問題出在persistentStoreCoordinator方法在GFree2AppDelegate.m文件。

你能用這個文件的managedObjectModelmanagedObjectContextpersistentStoreCoordinator方法的確切代碼更新你的問題嗎?

當您選中「使用核心數據存儲」時,這些方法由XCode生成。

順便說一下,你不應該導入.m文件。

+0

更新了我的文章。我不導入任何.m文件...只導入.h文件 - 但我不確定我是否應該在.h文件或.m文件中導入文件。 :/ framework似乎自動進入.h文件,那麼這是否意味着它們不需要包含在.m文件中? – 2010-08-28 12:56:04

+0

儘可能在.m文件中導入。在大多數情況下,您可以通過在@interface之前添加'@class MyClass;'行來避免.h文件中的警告...通常,您必須在.h文件中添加導入,僅用於您繼承或聲明的類你的類實現了一個位於某個文件中的協議... – 2010-08-28 13:26:48

+1

關於你的問題,試着填充Core Data方法中的所有'fileURLWithPath'並打印記錄(前一個和後一個)並找到哪一個是源問題... – 2010-08-28 13:29:02

1

由於GFree.momd不存在,您將收到錯誤消息。從NSURL的pathForRes的文檔:ofType:方法:

返回值資源文件的完整路徑名或nil(如果找不到該文件)。

GFree。momd是在構建時從.xcdatamodeld文件生成的(查看構建結果中用於啓動DataModelVersionCompile的行並展開它)。您是否刪除或重命名了該文件?

它是否仍列在構建目標的「編譯源代碼」部分? (在Xcode中展開目標/ [AppName] /編譯源)。

只注意到你的調試日誌說該應用程序被稱爲GFree2,但你的代碼正在尋找GFree.momd。你是否重命名該項目?如果數據模型文件現在稱爲GFree2.xcdatamodeld,那麼您需要將導入momd文件的行更改爲使用新的GFree2名稱。

+0

你好。回到工作中 - 對於遲到的回覆感到抱歉。我有一個GFree.xcdatamodel文件..?但我必須手動完成此操作,並自己命名。我在構建結果中查看了該行,但它沒有告訴我任何內容。我會把這條線放在我的OP中。 – 2010-08-31 14:28:25

相關問題