向现有 iPhone 项目添加核心数据

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

- NSManagedObjectContext undeclared


- Expected specifier-qualifier-list before 'NSManagedObjectModel'


- ...

我已经将核心数据框架添加到目标(右键单击我的项目下的“目标”,“添加”-“现有框架”,“ 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;
}
86968 次浏览

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

您只向我们展示了核心数据堆栈的头部(即声明) ,而不是实现(即定义)。

正如 Eimantas 所说你缺少核心堆栈的实现

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

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

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

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

#import <CoreData/CoreData.h>

你应该准备好出发了。

Xcode 4

对于在 Xcode 4中创建的项目,可以在 Project 导航器的 Supporting Files组中找到前缀文件。叫做 项目名称-前缀。默认为 pch’。

Xcode 6 +

从 Xcode 6开始,默认情况下不再包含预编译头文件。这是由于模块的引入,这是 不需要使用预编译头。虽然仍然可以手动添加一个 PCH 文件,以全球包括 CoreData 头,考虑指定 CoreData 依赖使用 @import CoreData; * 在每个文件中使用 CoreData。这使依赖变得明确,更重要的是将在未来避免这个问题。

* 模块 需要启用的工作原理。

如果您在 xcode 4中遇到同样的问题,就像我一样。 它是不同的: 我必须选择项目,然后在目标展开 “链接二进制与图书馆”,它显示当前的库。 从那里单击 + (加号)来选择任何您需要的附加库。 我把它放在项目的顶部,必须移动它(拖放)到 框架小组,但这就是它。

仅仅是阐述一下为了将核心数据添加到以前没有的项目中,实际需要执行的所有步骤:

步骤1: 添加框架

点击你的应用程序目标(在左侧面板的顶部图标与您的应用程序的名称) ,然后进入“构建阶段”选项卡,然后在“链接二进制与库”,点击底部的小“ +”,然后找到“ CoreData.Framework”,并将其添加到您的项目

然后要么导入所有你需要的对象的核心数据(非性感的方式) ,使用:

斯威夫特

import CoreData

目标 C

#import <CoreData/CoreData.h>

或者将导入添加到. pch 文件中常见导入的下面(更加性感) ,如下所示:

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

步骤2: 添加数据模型

添加。Xcdatamodel File 右键单击/控制-在右边窗格中单击您的文件(如在参考资料文件夹中保存) ,然后选择添加新文件,在选择文件类型时单击 Core Data 选项卡,然后单击“ Data Model”,给它一个名称,然后单击 Next 和 Finish,它将把它添加到您的项目中。当您单击此 Model 对象时,您将看到用于向项目添加具有所需关系的实体的接口。

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

斯威夫特中的 AppGenerate.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
}

目标 C中,确保将这些对象添加到 AppRegiate.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

像下面这样合成以前的对象:

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

然后将这些方法添加到 AppDeliate.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: 将数据对象放到需要数据的 ViewController 中

选项1。从 VC 中使用应用程序委托的 ManagedObjectContext (首选且更容易)

正如@bra-kazoo 所建议的那样,通过以下方式检索对应用代理及其托管对象上下文的引用:

斯威夫特

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

目标 C

 [[[UIApplication sharedApplication] delegate] managedObjectContext];

在你的 ViewController 中

选项2. 在 VC 中创建 ManagedObjectContext,并使其与 Appgenerate (原始)中的 Appgenerate 匹配

只显示旧版本的目标 C,因为更容易使用首选的方法

在 ViewController.h 中

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

在 ViewController.m 中

@synthesize managedObjectContext = _managedObjectContext;

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

ViewController.managedObjectContext = self.managedObjectContext;

如果您希望使用 Core Data 的 viewcontroller 成为 Fetchez ResultsController,那么您需要确保这些内容在 ViewController.h 中

@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}


@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

这是在 ViewController.m 中

@synthesize fetchedResultsController, managedObjectContext;

在所有这些之后,您现在可以使用这个 ManagedObjectContext 来运行 CoreData 优点所需的所有常见的 fetchRequest!好好享受吧

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

  1. 项目-> 目标-> 链接的框架和库 现在添加一个新的框架(点击 +)‘ CoreData’
  2. File-> new File-> CoreData-> DataModel 命名为 A.xcdatamodelid
  3. 在 A.xcdatamodelid 中创建新实体(单击 tity +) 将其命名为 BC,并在右侧的检查器窗口中将其类设置为“ BC”。
  4. 现在向实体添加属性(单击属性 +) ,为 eg: name 添加一个属性,其类型为 String。
  5. 现在编辑器-> create NSManagedObject Subclass —— > 在弹出窗口中单击 next —— > again next —— > 然后单击 create。 将创建两个新文件1. 一个名为 Bc.swift 的新类和一个名为 Bc + coredataProperties.swift 的扩展。
  6. 文件-> 新文件-> ios-> 可可触摸类-> 将其子类设置为 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 中包含语句 “导入 CoreData” A. 调用種()—— > 将值插入到 db/tity 中 B. 调用 get ()—— > 从 db/tity 获取值

/////籽()—— > 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)")
}
}

//get () 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)")
}
}

对于斯威夫特3:

File-> new File-> CoreData-> Model 来创建模型。

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

+(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 *)fetch:(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)delete{


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;








}
/*

保存按钮

    - (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

观看

  #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

细节

  #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

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

步骤1 : 添加框架

enter image description here

enter image description here

步骤2: Add Data model

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

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

步骤3: 将下面的函数添加到应用程序代理,并在顶部添加“ import 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)添加实体 enter image description here

B)添加属性 enter image description here

步骤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")
}
}
 let alert  = UIAlertController(title:"Error", message: "No Internet Connection", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in}))
alert.addAction(UIAlertAction(title: "Try Again", style: .default, handler: { (action) in
self.networkCall(text: self.daySelected)
}))
self.present(alert, animated: false, completion: nil)