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 从核心数据中获取数据并显示在表格中的主要内容,如果未能解决你的问题,请参考以下文章