Iphone 从核心数据中获取数据并显示在表格中

Posted

技术标签:

【中文标题】Iphone 从核心数据中获取数据并显示在表格中【英文标题】:Iphone fetching data from core data and displaying in table 【发布时间】: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 中? 【参考方案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;

以上是关于Iphone 从核心数据中获取数据并显示在表格中的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK:从核心数据填充表格视图

从iPhone的核心数据在tableview中一一添加单行

核心数据未在表视图中获取

React - 在表格行上触发点击事件并在另一个页面中显示所选行的详细信息

从核心数据中获取

如何从iphone中的货币代码中获取货币符号?