2012-05-31 42 views
0

錯誤:「原因:「+ entityForName:未能找到NSManagedObjectModel的實體名稱爲」iPhone取出由核心數據的數據並顯示在表

我創建使用標籤式應用程序的新項目。我創建了多個選項卡,然後在我的delegate.h文件中添加核心數據函數,如下所示。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 
    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 

    - (void)saveContext; 
    - (NSURL *)applicationDocumentsDirectory; 

現在我改變了delegate.m文件,如下

@synthesize window = _window; 
    @synthesize managedObjectContext = __managedObjectContext; 
    @synthesize managedObjectModel = __managedObjectModel; 
    @synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 

    #pragma mark - 
    #pragma mark Application lifecycle 

    - (void)saveContext 
    { 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&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. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
       } 
      } 
     } 

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
      { 
      // Override point for customization after application launch. 

       return YES; 
       } 

     - (void)applicationWillResignActive:(UIApplication *)application 
      { 

      } 

     - (void)applicationDidEnterBackground:(UIApplication *)application 
      { 

      } 

     - (void)applicationWillEnterForeground:(UIApplication *)application 
     { 

      } 

     - (void)applicationDidBecomeActive:(UIApplication *)application 
     { 
     } 

     - (void)applicationWillTerminate:(UIApplication *)application 
     { 

     [self saveContext]; 

      } 



    #pragma mark - Core Data stack 


    - (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; 
        } 
       NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myapp" withExtension:@"momd"]; 
      __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
       return __managedObjectModel; 
       } 

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

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

      NSError *error = nil; 
      __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
      if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 

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

     return __persistentStoreCoordinator; 
     } 

    #pragma mark - Application's Documents directory 

     - (NSURL *)applicationDocumentsDirectory 
     { 
     return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory   inDomains:NSUserDomainMask] lastObject]; 
     } 

     @end 

我有我在哪裏添加數據視圖控制器,我能夠獲取數據以及但是當我做同樣從表中獲取數據我得到一個錯誤,它無法找到coredata表。 我myappTableViewController.h文件如下:

  #import <UIKit/UIKit.h> 
      #import "myappAppDelegate.h" 

      @interface myappTableViewController : UITableViewController 


      @property(nonatomic,retain)NSManagedObjectContext *managedObjectContext; 
      @property(nonatomic,retain)NSArray *arr; 

     -(void)getData; 

      @end 

在myappTableViewController.m文件添加以下代碼:

-(void)getData{ 

      NSEntityDescription *entity = [NSEntityDescription entityForName:@"Data" inManagedObjectContext:managedObjectContext]; 

      NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

      [request setFetchBatchSize:20]; 

      [request setEntity:entity]; 

      NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 

      NSArray *newArray = [NSArray arrayWithObject:sort]; 

      [request setSortDescriptors:newArray]; 

      NSError *error; 

      NSMutableArray *results = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

      [self setArr:results]; 

      [self.tableView reloadData]; 


      } 

和我打電話[個體經營的getData]在ViewDidLoad中。和合成

  @synthesize managedObjectContext,arr; 


     - (void)viewDidLoad 
      { 
      [super viewDidLoad]; 

      [self getData]; 
      } 

現在有一些地方,我需要做的事情與管理的ObjectContext ..我想我只是缺少一行代碼的地方..

Prerna

+0

你的實體是否存在於你的.xcdatamodel中? – Simon

回答

0

你必須創建你的xcdatamodeld。根據你的代碼,它應該被稱爲myapp.xcdatamodeld。這個模型應該包含你想要獲取的實體,你的情況是Data

+0

我已經創建了xcdatamodel,並且我能夠在UIViewController中獲取和存儲數據,但是我想要在表格中顯示存儲的數據,並且這是我無法獲取數據的地方。我之前在UI ViewController中遇到了這個問題,當我添加app = [[UIApplication sharedApplication] delegate]時,它就消失了; 其中app是@property(nonatomic,retain)myappAppDelegate * app;一旦我在ViewDidLoad中添加了這個錯誤,錯誤消失了。所以我想知道是否有我需要在TableViewControllers viewDidLoad中需要添加的東西。 – Prerna

+0

你應該使用'NSFetchedResultsController'的實例。查看文檔並提供示例代碼。 – Mundi

+0

我在delegate.m didFinishlaunching方法中嘗試了類似的東西,我仍然得到了同樣的錯誤.. MyTableViewController * tableviewcontroller; NSManagedObjectContext * context = [self managedObjectContext];如果(!context){ //處理錯誤。 } //將託管對象上下文傳遞給視圖控制器。 tableviewcontroller.managedObjectContext = self.managedObjectContext; – Prerna