2011-09-29 102 views
1

我需要使用核心數據爲我的項目保留數據,到目前爲止我所做的工作編譯得很好,但是當我真正開始使用核心數據存儲內容時,程序就會退出,而我不知道原因。我爲appDelegate文件中的核心數據設置了所有必需的組件,並且我想將數據存儲在名爲DetailViewControllerviewController中。這是我做了什麼:在現有項目中使用核心數據

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after application launch. 

    // Set the tab bar controller as the window's root view controller and display. 
    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 

//this is what I added, reference managedObjectContext in the detail view controller. 

    detailViewController = [[DetailViewController alloc] init]; 
    detailViewController.managedObjectContext = [self managedObjectContext]; 

    return YES; 
} 

核心數據的所有組件已落實

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

    return managedObjectContext; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
      return managedObjectModel; 
    } 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

    return managedObjectModel; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
              stringByAppendingPathComponent: @"MyProjectName.sqlite"]]; 
    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
              configuration:nil URL:storeUrl options:nil error:&error]) { 
     /*Error for store creation should be handled in here*/ 
    } 

    return persistentStoreCoordinator; 
} 

- (NSString *)applicationDocumentsDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

當我嘗試調用一個方法的詳細視圖來存儲數據,程序退出。

-(IBAction) addItem { 
    Info *info = [NSEntityDescription insertNewObjectForEntityForName:@"Info" 
                inManagedObjectContext:managedObjectContext]; 
    info.name = item.name; 
} 

item是在詳細視圖中當前對象,Info是模型類文件。我在這裏想念什麼?

謝謝!

更新:

在控制檯中的錯誤信息是:

終止應用程序由於未捕獲的異常「NSInternalInconsistencyException」,原因是:「+ entityForName:未能找到NSManagedObjectModel爲實體名稱‘信息’」

但我在「Resources」文件夾中有一個Info.xcdatamodel文件,實體名稱是「Info」。

+0

您的模型中是否有實體'@「Info?並且在調試控制檯中顯示什麼錯誤? – Nekto

+0

是的,模型文件已經創建,實體名稱是「Info」。 'managedObjectContext!= nil'是否爲 – Michael

+0

? – Nekto

回答

1

你叫[self.managedObjectContext save:&error]

此外,也許您的包加載例程無法正常工作。嘗試像這樣加載managedObjectContext:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ModelName" 
    withExtension:@"momd"]; 
__managedObjectModel = [[NSManagedObjectModel alloc] 
    initWithContentsOfURL:modelURL];  
return __managedObjectModel; 
+0

嗨,我找不到以「momd」擴展名結尾的文件或目錄,現在我遇到了另一個麻煩,當我刪除原始模型文件並在其中創建一個具有相同實體的新文件時,錯誤顯示「Can將模型與兩個不同的實體合併「。 – Michael

+0

似乎你的項目文件在其他文件夾中引用了一個託管對象模型。刪除所有對模型的引用,無論是在磁盤上還是在項目瀏覽器中(我認爲這是錯誤)。然後重新創建。也重置iOS模擬器。這應該解決這個困惑。 – Mundi

+0

啊,我終於解決了,只要把「媽媽」換成「媽媽」...謝謝〜 – Michael

0

我的猜測是,在您的詳細視圖控制器中,您要麼不合成managedObjectContext,要麼在創建詳細視圖控制器時未初始化它。檢查兩者是否都完成。如果這不能解決問題,請在崩潰後檢查控制檯輸出,並在問題更新中發佈任何相關信息。

+0

我已經在.m文件中合成了它,我沒有初始化它,因爲我已經在appDelegate文件中引用它,並且已將appDelegate中的managedObjectContext分配給其中一個詳細視圖控制器。 – Michael

相關問題