2012-04-14 109 views
0

我在玩,學習CoreData,以及以UITableView作爲根的測試應用程序時,它顯示數據正常。這會告訴我它正在從中提取數據的數據庫設置正確。試圖讓我的CoreData在我的應用程序中顯示

現在我想有一個UIViewController作爲初始視圖控制器(通過故事板),它不斷給我這個錯誤 -

不能用零模型

創建NSPersistentStoreCoordinator

現在我已經讀了很多論壇和教程的,他們都基本上說,我要確保我的xcdatamodel文件這個

URLForRe匹配來源:@「Model」withExtension:@「momd」]

它的確如此,如果UITableView是根視圖,我可以再次顯示數據。

現在,如果我改變:

- (NSManagedObjectModel *)managedObjectModel 
{ 
if (__managedObjectModel != nil) 
{ 
    return __managedObjectModel; 
} 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model"  withExtension:@"momd"]; 
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
return __managedObjectModel; 
} 

成這樣:

- (NSManagedObjectModel *)managedObjectModel 
{ 
if (__managedObjectModel != nil) 
{ 
    return __managedObjectModel; 
} 
    //NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; // I have commented out this line because the NSURL is no longer being used. 
__managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
return __managedObjectModel; 
} 

的應用程序運行,但的TableView是空的,這對我來說很有意義,因爲我不鏈接到CoreData文件。 - 問題是 - 我如何使用安裝程序運行應用程序並顯示數據?

乾杯傑夫


@應答先回答由傑夫·沃爾斯基

感謝您的回答,我覺得我是在正確的道路上 - 我不得不稍微改變它到我的項目刪除錯誤。我知道有

AppDelegate appDelegate = (AppDelegate) [[UIApplication sharedApplication] delegate]; 

所以我就把這是

- (NSManagedObjectModel *)managedObjectModel { 

區 - 是正確的?另外它現在已經拿出appDelegate變量未使用的警告。可能是一個簡單的問題,但我現在在哪裏使用該變量?乾杯傑夫


我已經發布了什麼,我認爲是你是什麼@Jody Hagins後 - 希望它可以幫助:-)

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
if (__persistentStoreCoordinator != nil) 
{ 
    return __persistentStoreCoordinator; 
} 

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ViewToNav.sqlite"]; 

NSError *error = nil; 
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
{ 

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

return __persistentStoreCoordinator; 
} 

乾杯傑夫

+0

你的persistentStoreCoordinator()是什麼樣的? – 2012-04-14 02:52:50

+0

嗨喬迪,我已經添加了更多的代碼,我認爲你問:-) – 2012-04-14 06:15:42

+0

你在這裏訪問應用程序委託的代碼是錯誤的..你甚至沒有使用指針......這是正確的傑夫的帖子。再去看看那裏。另外,我認爲你應該看一下蘋果生成的代碼,因爲我認爲你很困惑。簡單的方法:在Xcode中,選擇New Project,然後選擇Master-Detail並檢查CoreData項目。它會創建一個項目,如何做到這一點很好的例子。 – 2012-04-14 06:28:14

回答

1

您需要設置所有的您的應用程序委託中的核心數據。託管對象模型需要是您的視圖可以訪問的應用程序委託中的屬性。在您的視圖控制器,你可以得到一個鉤到應用程序委託有

MyAppDelegate *appDelegate = (MyAppDelegate*) [[UIApplication sharedApplication] delegate]; 

這將允許您執行從你喜歡的任何視圖控制器獲取。

編輯:

,我們需要有appDelegate在視圖控制器的原因是,我們可以訪問NSManagedObjectContext這是在應用程序的委託。所以你不需要把NSManagedObjectModel放在你的視圖控制器中。 NSManagedObjectContext(MOC)可讓您訪問應用程序委託中已存在的整個核心數據堆棧。

在您的應用程序委託中,您的MOC應設置爲屬性。現在,您可以在視圖控制器中執行此操作。

myMOC = appDelegate.MOC; 

現在myMOC可讓您訪問您的核心數據。您將在視圖控制器中創建一個NSFetchedResultsController作爲屬性。在你的getter方法中,其中一個步驟是創建一個NSEntityDescription。這是您使用您的self.myMOC的地方,因此將您的NSFetchedResultsController綁定到您的核心數據模型。

+0

感謝您的回答,我認爲我在正確的道路上 - 我不得不稍微改變它以適應我的項目,以消除錯誤。我知道有 AppDelegate * appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; 所以我把這是「 - (NSManagedObjectModel *)managedObjectModel {」區 - 是否正確? 另外它現在已經拿出appDelegate變量沒有使用的警告。可能是一個簡單的問題,但我現在在哪裏使用該變量? 乾杯 – 2012-04-14 06:09:29

+0

我已經複製了我對問題的回答,以避免混淆代碼。乾杯 – 2012-04-14 06:12:23

+0

好吧,我現在開始瞭解它,但仍然要尋找寫這個地方 - 謝謝你的提示。如果我有任何其他問題,我可以回覆:-) – 2012-04-14 07:57:36

相關問題