2011-01-11 37 views
0

我對Objective C比較陌生。到目前爲止,所有事情都進行得非常順利,直到我點擊CoreData。我無法讓它工作!花了好幾個小時看起來很直截了當的事情之後,我的智慧就這樣結束了。CoreDef與AppDelegate問題

請幫我找出我做錯了:

  • 我創建了一個新的基於Windows的應用程序,並檢查「使用的核心數據存儲」
  • 在xcdatamodel,我創建了一個名爲實體'RecipeData'只有一個屬性'recipeName',它是一個字符串
  • 在應用程序委託中,我加載了一個XML文件並解析它。當我解析食譜名稱時,我使用以下內容:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:managedObjectContext];

我得到以下錯誤:

terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'RecipeData' 

這使我大3個問題:

  • 有什麼真的很明顯,我做錯了什麼?
  • ,因爲我檢查「使用的核心數據進行存儲,」看來下面的代碼會自動注入到應用程序委託.H:

    @private 的NSManagedObjectContext * managedObjectContext_;

     NSManagedObjectModel *managedObjectModel_; 
    
         NSPersistentStoreCoordinator *persistentStoreCoordinator_; 
    

    @property(nonatomic,retain,readonly)NSManagedObjectContext * managedObjectContext;

這會干擾我使用的代碼嗎?

  • 我試着創建一個名爲* myManagedObjectContext的新的NSManagedObjectContext,但沒有奏效。

一個其它珍聞,當我添加以下的正上方我的代碼:

如果(managedObjectContext ==無){

的NSLog(@ 「否CONTEXT」);
}

控制檯打印 「沒有上下文」

我真的很感激任何幫助。謝謝。

+0

我會建議使用由模板提供的默認情況下加載的方法。刪除您的自定義managedObjectContext變量和屬性,並改爲使用self.managedObjectContext。 – ughoavgfhw 2011-01-11 22:17:38

+0

謝謝!這解決了它,我改變了代碼:recipeData * dataName =(recipeData *)[NSEntityDescription insertNewObjectForEntityForName:@「recipeData」inManagedObjectContext:self.managedObjectContext]; – 2011-01-11 22:20:44

回答

0

managedObjectContext從何而來?這是managedObjectContext_的拼寫錯誤嗎?項目模板創建後者,而不是前者。使用上面的代碼和標準項目模板提供的代碼應該會產生語法錯誤。我猜你已經重新命名了一些東西?

您似乎使用managedObjectContext作爲ivar。這是一個財產。在課堂內部,有一個私人的managedObjectContext_ ivar,它持有對對象上下文的引用。你不應該訪問這個。您應該訪問managedObjectContext屬性。當第一次訪問該屬性時,其getter方法將爲您創建上下文。由於您未訪問該屬性,因此不會調用getter方法,也不會創建上下文。

如果你有這樣的代碼:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:managedObjectContext]; 

...你應該使用這樣的代碼:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:self.managedObjectContext]; 

注意self.位。這意味着您正在訪問self對象上的屬性,而不是從調用方法的對象訪問ivar。

注意,閱讀性質是一樣調用getter方法,所以上面的也可以寫爲:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:[self managedObjectContext]];