【问题标题】:Iphone fetching data from core data and displaying in tableIphone 从核心数据中获取数据并显示在表格中
【发布时间】:2012-05-31 18:17:42
【问题描述】:

错误:“原因:'+entityForName: 找不到实体名称的 NSManagedObjectModel”

我使用选项卡式应用程序创建了一个新项目。我创建了多个选项卡,然后在我的 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

我有一个视图控制器,我在其中添加数据并且我也能够获取数据,但是当我执行相同的操作以从表中获取数据时,我收到一个无法找到的错误核心数据表。 我的 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];


           }

我正在调用 [self getData];在 ViewDidLoad 中。和合成

          @synthesize managedObjectContext,arr;


       - (void)viewDidLoad
          {
            [super viewDidLoad];

             [self getData];
          }

现在有什么地方我需要对托管对象上下文做一些事情。我想我只是在某处丢失了那一行代码。

早产

【问题讨论】:

  • 您的实体是否存在于您的 .xcdatamodel 中?

标签: iphone core-data uitableview


【解决方案1】:

您必须创建您的xcdatamodeld。根据您的代码,它应该被称为myapp.xcdatamodeld。此模型应包含您要获取的实体,在您的情况下为 Data

【讨论】:

  • 我已经创建了 xcdatamodel,并且能够在 UIViewController 中获取和存储数据,但我想在表中显示存储的数据,而这正是我无法获取数据的地方。我之前在 UI ViewController 中遇到过这个问题,当我添加 app = [[UIApplication sharedApplication]delegate]; 时它就消失了。其中 app 是 @property(nonatomic,retain) myappAppDelegate *app;一旦我在 ViewDidLoad 中添加了这个,错误就消失了。所以我想知道在我需要添加的 TableViewControllers viewDidLoad 中是否需要类似的东西。
  • 您应该使用NSFetchedResultsController 的实例。查看文档并提供示例代码。
  • 我在delegate.m didFinishlaunching 方法中尝试了类似的方法,但我仍然得到同样的错误.. MyTableViewController *tableviewcontroller;NSManagedObjectContext *context = [self managedObjectContext]; if (!context) { // 处理错误。 } // 将托管对象上下文传递给视图控制器。 tableviewcontroller.managedObjectContext = self.managedObjectContext;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多