将核心数据添加到现有的iPhone项目

我想添加核心数据到一个现有的iPhone项目,但我仍然有很多编译错误:

- NSManagedObjectContext undeclared - Expected specifier-qualifier-list before 'NSManagedObjectModel' - ... 

我已经将Core Data Framework添加到目标(在“目标”,“添加” – “现有框架”,“CoreData.framework”)下右键单击我的项目。

我的头文件:

 NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; [...] @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; 

我错过了什么? 开始一个新项目不是一个选项…

非常感谢!

编辑抱歉,我有这些实现…但似乎像缺乏库…实施方法充满编译错误像“ managedObjectContext undeclared ”,“ NSPersistentStoreCoordinator undeclared ”,但也与“预期”)“之前NSManagedObjectContext “(虽然看起来像括号是正确的)…

 #pragma mark - #pragma mark Core Data stack /** Returns the managed object context for the application. If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. */ - (NSManagedObjectContext *) managedObjectContext { if (managedObjectContext != nil) { return managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator: coordinator]; } return managedObjectContext; } /** Returns the managed object model for the application. If the model doesn't already exist, it is created by merging all of the models found in application bundle. */ - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; } /** Returns the persistent store coordinator for the application. If the coordinator doesn't already exist, it is created and the application's store added to it. */ - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Core_Data.sqlite"]]; NSError *error = nil; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&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. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. Typical reasons for an error here include: * The persistent store is not accessible * The schema for the persistent store is incompatible with current managed object model Check the error message to determine what the actual problem was. */ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return persistentStoreCoordinator; } 

所有的CoreData头文件都是在App_Prefix.pch中导入的,所以CoreData类将在你的项目中可用,所以你不必手动导入你需要的文件头。

所以打开Xcode并找一些像App_Prefix.pch这样的文件,默认情况下它在Other Sources组中。 在UIKit导入语句之后,添加以下行:

 #import <CoreData/CoreData.h> 

而且你应该准备好去。

Xcode 4

对于在Xcode 4中创build的项目,前缀文件可以在项目导航器的Supporting Files组中find。 它默认被称为“ projectname -Prefix.pch”。

Xcode 6+

从Xcode 6开始,默认不再包含预编译的头文件。 这是因为引入了模块, 而不需要使用预编译头文件。 尽pipe仍然可以手动添加PCH文件来全局包含CoreData标题,但可以考虑使用@import CoreData;指定CoreData依赖@import CoreData; *在每个使用CoreData的文件中。 这使得依赖关系更加明确,更重要的是将来避免这个问题的问题。

*模块需要启用这个工作。

只是为了阐述您实际需要执行的所有步骤,以将Core Data添加到以前没有的项目中:

步骤1:添加框架

点击你的应用程序目标(在左边的窗格上它的顶部图标与你的应用程序的名称),然后进入“构build阶段”选项卡,然后在“链接库与二进制文件”,点击底部的小“+”,然后find'CoreData.framework'并将其添加到您的项目

然后要么使用以下方式将coredata导入所有需要的对象(非性感方式):

迅速

 import CoreData 

目标C

 #import <CoreData/CoreData.h> 

或者在你的.pch文件(比较性感的)中通用导入的下面添加import:

 #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> #endif 

第2步:添加数据模型

要添加.xcdatamodel文件,请右键单击/右键单击右侧窗格中的文件(如Resources文件夹中的安全保存),然后select添加新文件,select文件types时单击Core Data选项卡,然后单击“数据模型“,给它一个名字,点击下一步和完成,它会将它添加到你的项目中。 当你点击这个模型对象时,你会看到一个界面,用你想要的任何关系将实体添加到你的项目中。

第3步:更新应用程序委托

Swift上AppDelegate.swift

 //replace the previous version of applicationWillTerminate with this func applicationWillTerminate(application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Saves changes in the application's managed object context before the application terminates. self.saveContext() } func saveContext () { var error: NSError? = nil let 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. //println("Unresolved error \(error), \(error.userInfo)") abort() } } } // #pragma mark - Core Data stack // Returns the managed object context for the application. // If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. var managedObjectContext: NSManagedObjectContext { if !_managedObjectContext { let coordinator = self.persistentStoreCoordinator if coordinator != nil { _managedObjectContext = NSManagedObjectContext() _managedObjectContext!.persistentStoreCoordinator = coordinator } } return _managedObjectContext! } var _managedObjectContext: NSManagedObjectContext? = nil // Returns the managed object model for the application. // If the model doesn't already exist, it is created from the application's model. var managedObjectModel: NSManagedObjectModel { if !_managedObjectModel { let modelURL = NSBundle.mainBundle().URLForResource("iOSSwiftOpenGLCamera", withExtension: "momd") _managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL) } return _managedObjectModel! } var _managedObjectModel: NSManagedObjectModel? = nil // Returns the persistent store coordinator for the application. // If the coordinator doesn't already exist, it is created and the application's store added to it. var persistentStoreCoordinator: NSPersistentStoreCoordinator { if !_persistentStoreCoordinator { let storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("iOSSwiftOpenGLCamera.sqlite") var error: NSError? = nil _persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) if _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil { /* 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. Typical reasons for an error here include: * The persistent store is not accessible; * The schema for the persistent store is incompatible with current managed object model. Check the error message to determine what the actual problem was. If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory. If you encounter schema incompatibility errors during development, you can reduce their frequency by: * Simply deleting the existing store: NSFileManager.defaultManager().removeItemAtURL(storeURL, error: nil) * Performing automatic lightweight migration by passing the following dictionary as the options parameter: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true} Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. */ //println("Unresolved error \(error), \(error.userInfo)") abort() } } return _persistentStoreCoordinator! } var _persistentStoreCoordinator: NSPersistentStoreCoordinator? = nil // #pragma mark - Application's Documents directory // Returns the URL to the application's Documents directory. var applicationDocumentsDirectory: NSURL { let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) return urls[urls.endIndex-1] as NSURL } 

Objective C中,确保将这些对象添加到AppDelegate.h中

  @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (NSURL *)applicationDocumentsDirectory; // nice to have to reference files for core data 

在AppDelegate.m中合成前面的对象,如下所示:

 @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; 

然后将这些方法添加到AppDelegate.m(确保将您添加的模型的名称显示在图中):

 - (void)saveContext{ NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } - (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:@"NAMEOFYOURMODELHERE" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NAMEOFYOURMODELHERE.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 // Returns the URL to the application's Documents directory. - (NSURL *)applicationDocumentsDirectory{ return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } 

第4步:将数据对象获取到需要数据的ViewControllers

选项1.使用VC中的App Delegate的ManagedObjectContext(首选和更简单)

正如@ brass-kazoo所示 – 通过以下方法检索对AppDelegate及其managedObjectContext的引用:

迅速

  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate appDelegate.managedObjectContext 

目标C

  [[[UIApplication sharedApplication] delegate] managedObjectContext]; 

在你的ViewController

选项2.在VC中创buildManagedObjectContext并使其与AppDelegate(原始)中的AppDelegate匹配

只显示Objective-C的旧版本,因为使用首选方法要容易得多

在ViewController.h中

 @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 

在ViewController.m中

 @synthesize managedObjectContext = _managedObjectContext; 

在AppDelegate或创buildViewController的类中,将managedObjectContext设置为与AppDelegate相同

 ViewController.managedObjectContext = self.managedObjectContext; 

如果你想使用核心数据的viewcontroller是一个FetchedResultsController那么你需要确保这些东西在你的ViewController.h

 @interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> { NSFetchedResultsController *fetchedResultsController; NSManagedObjectContext *managedObjectContext; } @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 

这是在ViewController.m

 @synthesize fetchedResultsController, managedObjectContext; 

毕竟,现在可以使用这个managedObjectContext来运行CoreData所需的所有常用fetchRequests! 请享用

尝试创buildCore Data支持的Cocoa应用程序,并查看AppDelegate。 您将看到核心数据堆栈实现方法以及用于定义您的实体和其他核心数据相关内容的托pipe对象模型文件。

您只向我们显示了头(即声明),但没有实现(即定义)核心数据堆栈。

如果你在xcode 4遇到同样的问题,就像我一样。 这是不同的:我不得不select项目,然后在目标展开“Link Binary With Libraries” (显示当前库的链接)。 从那里点击+(加号)select你需要的任何附加库。 我把它放在项目的顶部,不得不将它移动(拖放)到框架组 ,但就是这样。

正如Eimantas所说的你错过了Core Stack的实现,就像

 - (NSManagedObjectContext *) managedObjectContext; - (NSManagedObjectModel *)managedObjectMode; - (NSPersistentStoreCoordinator *)persistentStoreCoordinator; 

解决scheme是创build一个新的核心数据驱动程序项目,并将实现复制/粘贴到您的项目中。

对于Swift 3:

File-> new file-> CoreData-> Model来创build一个模型。

有关如何实现它的更多信息,请参阅此链接 。

对于Swift 3:包括保存和检索数据

第1步 :添加框架

在这里输入图像说明

在这里输入图像说明

第2步:添加数据模型

文件>新build>文件>核心数据>数据模型

  • 将该文件命名为SampleData ,结果文件将为SampleData.xcdatamocelId

第3步:将下面的函数添加到您的应用程序委托,并将“导入CoreData”添加到顶部

 func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Saves changes in the application's managed object context before the application terminates. self.saveContext() } // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { /* The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. */ // SEE BELOW LINE OF CODE WHERE THE 'name' IS SET AS THE FILE NAME (SampleData) FOR THE CONTAINER let container = NSPersistentContainer(name: "SampleData") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { // Replace this implementation with code to handle the error appropriately. // fatalError() 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. /* Typical reasons for an error here include: * The parent directory does not exist, cannot be created, or disallows writing. * The persistent store is not accessible, due to permissions or data protection when the device is locked. * The device is out of space. * The store could not be migrated to the current model version. Check the error message to determine what the actual problem was. */ fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }() // MARK: - Core Data Saving support func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() 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. let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } 

第4为模型添加实体和属性

a)添加实体 在这里输入图像说明

b)添加属性 在这里输入图像说明

第5保存数据

 func saveItem(itemToSave: String){ let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext //**Note:** Here we are providing the entityName **`Entity`** that we have added in the model let entity = NSEntityDescription.entity(forEntityName: "Entity", in: context) let myItem = NSManagedObject(entity: entity!, insertInto: context) myItem.setValue(itemToSave, forKey: "item") do { try context.save() } catch{ print("There was an error in saving data") } } 

第5检索数据

 override func viewWillAppear(_ animated: Bool) { // Obtaining data from model let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity") do { let results = try context.fetch(fetchRequest) let obtainedResults = results as! [NSManagedObject] let firstResult = obtainedResults[0] let myValue = firstResult.value(forKey: "item") print("myValue: \(myValue)") } catch { print("Error") } } 

//在Swift 2.2中,您可以在不更改AppDelegate文件的情况下执行以下操作。

  1. 项目 – >目标 – >链接的框架和库现在添加一个新的框架(点击+)'CoreData'
  2. File-> new file-> CoreData-> DataModel将其命名为A.xcdatamodelid
  3. 在A.xcdatamodelid中创build新的实体(点击实体+)将其命名为Bc,并在右侧的检查器窗口中将其类设置为“Bc”。
  4. 现在添加属性到实体(点击属性+),添加一个属性例如:名称及其types为string。
  5. 现在编辑 – >创buildNSManagedObject子类 – >点击下一个popup窗口 – >再次下一个 – >然后单击创build。 将创build两个新文件1.一个名为Bc.swift的新类和一个名为Bc + coredataproperties.swift的扩展名。
  6. File-> new file-> ios-> cocoa Touch类 – >将其子类设置为NSObject->将其命名为DataController.swift文件内部包含///

    导入UIKit导入CoreData类DataController:NSObject {

     var managedObjectContext: NSManagedObjectContext override init() { // This resource is the same name as your xcdatamodeld contained in your project. guard let modelURL = NSBundle.mainBundle().URLForResource("A", withExtension:"momd") else { fatalError("Error loading model from bundle") } // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else { fatalError("Error initializing mom from: \(modelURL)") } let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) self.managedObjectContext.persistentStoreCoordinator = psc let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) let docURL = urls[urls.endIndex-1] /* The directory the application uses to store the Core Data store file. This code uses a file named "A.sqlite" in the application's documents directory. */ let storeURL = docURL.URLByAppendingPathComponent("A.sqlite") do { try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil) } catch { fatalError("Error migrating store: \(error)") } } 

    }

//////

  1. 现在在viewcontroller文件中,你可以使用两种方法访问你的数据库。 重要提示:在你的viewController“import CoreData”中包含语句a。 调用seed() – >将值插入到数据库/实体b。 调用fetch() – >从数据库/实体中获取值

///////种子() – > DEF

 func seedPerson() { // create an instance of our managedObjectContext let moc = DataController().managedObjectContext // we set up our entity by selecting the entity and context that we're targeting let entity = NSEntityDescription.insertNewObjectForEntityForName("Bc", inManagedObjectContext: moc) as! Bc // add our data entity.setValue("Meera", forKey: "name") // we save our entity do { try moc.save() } catch { fatalError("Failure to save context: \(error)") } } 

//获取()def

 func fetch() { let moc = DataController().managedObjectContext let personFetch = NSFetchRequest(entityName: "Bc") do { let fetchedPerson = try moc.executeFetchRequest(personFetch) as! [Bc] print(fetchedPerson.first!.name!) } catch { fatalError("Failed to fetch person: \(error)") } } 

+(void)insetPlusUpdate:(NSDictionary *)dataa {

 NSManagedObjectContext * context; if (![[NSThread currentThread] isMainThread]) { context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]]; } else { context = [APP_DELEGATE managedObjectContext]; } NSFetchRequest * request = [[NSFetchRequest alloc] init]; NSEntityDescription * entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:context]; [request setEntity:entity]; NSPredicate * check = [NSPredicate predicateWithFormat:@"attribute == %@", Dict[@"key"]]; [request setPredicate:check]; NSError * error = nil; if ([context countForFetchRequest:request error:&error] == 0) { 

Entity.attribute = @“”;

 } else { NSArray * array = [context executeFetchRequest:request error:&error]; EntityName * entity = [array firstObject]; 

Entity.attribute = @“”;

 } 

}

+(NSString *)获取:(NSString *)feed_id {

 NSManagedObjectContext * context; if(![[NSThread currentThread] isMainThread]){ context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]]; } else { context = [APP_DELEGATE managedObjectContext]; } NSFetchRequest * request = [[NSFetchRequest alloc] init]; NSEntityDescription * entity = [NSEntityDescription entityForName:@"ENTITYNAME" inManagedObjectContext:context]; [request setEntity:entity]; 

NSPredicate * check = [NSPredicate predicateWithFormat:@“attribute ==%@”,Dict [@“key”]];

 [request setPredicate:check]; NSError * error = nil; if ([context countForFetchRequest:request error:&error] > 0) { NSArray * array = [context executeFetchRequest:request error:&error]; ENTITYNAME * fetchData = [array firstObject]; NSString * string = fetchData.attribte[@"key"]; return string; } return nil; 

}

+(BOOL)删除{

 NSManagedObjectContext * context; if (![[NSThread currentThread] isMainThread]) { context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]]; } else { context = [APP_DELEGATE managedObjectContext]; } NSFetchRequest * request = [[NSFetchRequest alloc] init]; NSEntityDescription * entity = [NSEntityDescription entityForName:@"ENTITYNAME" inManagedObjectContext:context]; [request setEntity:entity]; NSError *error = nil; NSBatchDeleteRequest *deleteRequest = [[NSBatchDeleteRequest alloc] initWithFetchRequest: request]; @try{ [context executeRequest:deleteRequest error:&error]; if([context save:&error]){ NSLog(@"Deleted"); return [context save:&error]; } else{ return [context save:&error]; } } @catch(NSException *exception){ NSLog(@"failed %@",exception); return [context save:&error]; } 

}

示例编码视图1

  #import "ViewController.h" #import "DetailViewController.h" @interface ViewController () { NSInteger indexPathvalue; } @end @implementation ViewController - (NSManagedObjectContext *)managedObjectContext { NSManagedObjectContext *context = nil; id delegate = [[UIApplication sharedApplication] delegate]; if ([delegate performSelector:@selector(managedObjectContext)]) { context = [delegate managedObjectContext]; } return context; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSLog(@"call this one2"); } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Details"]; self.dataList = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; [_coreDataList reloadData]; NSLog(@"call this one"); } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section { return self.dataList.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } NSManagedObject *user = [self.dataList objectAtIndex:indexPath.row]; cell.textLabel.text = [user valueForKey:@"name"]; cell.detailTextLabel.text = [user valueForKey:@"mobileNumber"]; cell.imageView.image = [UIImage imageWithData:[user valueForKey:@"imageView"]]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { indexPathvalue = indexPath.row; [self performSegueWithIdentifier:@"detailView" sender:self]; } - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath: (NSIndexPath *)indexPath { return YES; } - (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath: (NSIndexPath *)indexPath { NSManagedObjectContext *context = [self managedObjectContext]; if (editingStyle == UITableViewCellEditingStyleDelete) { [context deleteObject:[self.dataList objectAtIndex:indexPath.row]]; NSError *error = nil; if (![context save:&error]) { NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); return; } [self.dataList removeObjectAtIndex:indexPath.row]; [_coreDataList reloadData]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)addBtnClick:(id)sender { } #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. if ([segue.identifier isEqualToString:@"detailView"]) { NSManagedObject *obj = [self.dataList objectAtIndex:indexPathvalue]; DetailViewController *detail = segue.destinationViewController; detail.userData = obj; } } @end 

样品细节视图

  #import "DetailViewController.h" @interface DetailViewController () @end @implementation DetailViewController - (NSManagedObjectContext *)managedObjectContext { NSManagedObjectContext *context = nil; id delegate = [[UIApplication sharedApplication] delegate]; if ([delegate performSelector:@selector(managedObjectContext)]) { context = [delegate managedObjectContext]; } return context; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if (self.userData) { [self.nameTxt setText:[self.userData valueForKey:@"name"]]; [self.mobileTxt setText:[self.userData valueForKey:@"mobileNumber"]]; [self.emailIdTxt setText:[self.userData valueForKey:@"email"]]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } /* 

savebutton

  - (IBAction)saveBtnClick:(id)sender { NSManagedObjectContext *context = [self managedObjectContext]; if (self.userData) { // Update existing data [self.userData setValue:self.nameTxt.text forKey:@"name"]; [self.userData setValue:self.mobileTxt.text forKey:@"mobileNumber"]; [self.userData setValue:self.emailIdTxt.text forKey:@"email"]; UIImage *sampleimage = [UIImage imageNamed:@"icon.png"]; NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0); [self.userData setValue:dataImage forKey:@"imageView"]; } else { // Create a new data NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:context]; [newDevice setValue:self.nameTxt.text forKey:@"name"]; [newDevice setValue:self.mobileTxt.text forKey:@"mobileNumber"]; [newDevice setValue:self.emailIdTxt.text forKey:@"email"]; UIImage *sampleimage = [UIImage imageNamed:@"icon.png"]; NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0); [newDevice setValue:dataImage forKey:@"imageView"]; } NSError *error = nil; // Save the object to persistent store if (![context save:&error]) { NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); } [self dismissViewControllerAnimated:YES completion:nil]; } @end 

view.h

  #import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (weak, nonatomic) IBOutlet UITableView *coreDataList; - (IBAction)addBtnClick:(id)sender; @property (strong, nonatomic) NSMutableArray *dataList; @end 

detail.h

  #import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface DetailViewController : UIViewController<UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UITextField *nameTxt; @property (weak, nonatomic) IBOutlet UITextField *mobileTxt; @property (weak, nonatomic) IBOutlet UITextField *emailIdTxt; - (IBAction)saveBtnClick:(id)sender; @property (strong,nonatomic) NSManagedObject *userData; @end 
  - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if (self.userData) { [self.nameTxt setText:[self.userData valueForKey:@"name"]]; [self.mobileTxt setText:[self.userData valueForKey:@"mobileNumber"]]; [self.emailIdTxt setText:[self.userData valueForKey:@"email"]]; [self.imgView setImage:[UIImage imageWithData:[self.userData valueForKey:@"imageView"]]]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } /* #pragma mark - Navigation - (IBAction)browseBtn:(id)sender { UIImagePickerController *imgpic =[[UIImagePickerController alloc]init]; imgpic .delegate =self; imgpic .sourceType =UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:imgpic animated:YES completion:nil]; } -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { UIImage *choose = info[UIImagePickerControllerOriginalImage]; self.imgView.image=choose; [picker dismissViewControllerAnimated:YES completion:nil]; } - (IBAction)saveBtnClick:(id)sender { NSManagedObjectContext *context = [self managedObjectContext]; if (self.userData) { // Update existing data [self.userData setValue:self.nameTxt.text forKey:@"name"]; [self.userData setValue:self.mobileTxt.text forKey:@"mobileNumber"]; [self.userData setValue:self.emailIdTxt.text forKey:@"email"]; UIImage *sampleimage = _imgView.image; NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0); [self.userData setValue:dataImage forKey:@"imageView"]; } else { // Create a new data NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Details" inManagedObjectContext:context]; [newDevice setValue:self.nameTxt.text forKey:@"name"]; [newDevice setValue:self.mobileTxt.text forKey:@"mobileNumber"]; [newDevice setValue:self.emailIdTxt.text forKey:@"email"]; UIImage *sampleimage = _imgView.image; NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0); [newDevice setValue:dataImage forKey:@"imageView"]; } NSError *error = nil; // Save the object to persistent store if (![context save:&error]) { NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); } [self dismissViewControllerAnimated:YES completion:nil]; } @end 

。H

  #import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface DetailViewController : UIViewController<UITextFieldDelegate,UINavigationControllerDelegate, UIIma gePickerControllerDelegate> @property (weak, nonatomic) IBOutlet UITextField *nameTxt; @property (weak, nonatomic) IBOutlet UITextField *mobileTxt; @property (weak, nonatomic) IBOutlet UITextField *emailIdTxt; @property (weak, nonatomic) IBOutlet UIImageView *imgView; - (IBAction)browseBtn:(id)sender; - (IBAction)saveBtnClick:(id)sender; @property (strong,nonatomic) NSManagedObject *userData; @end