Core Date是ios3.0后引入的数据持久化解决方式,它是是苹果官方推荐使用的。不须要借助第三方框架。Core Date实际上是对SQLite的封装。提供了更高级的持久化方式。在对数据库操作时,不须要使用sql语句。也就意味着即使不懂sql语句。也能够操作数据库中的数据。

  在各类应用开发中使用数据库操作时通常都会用到 (ORM) “对象关系映射”。Core Data就是这种一种模式。ORM是将关系数据库中的表,转化为程序中的对象,但实际上是对数据中的数据进行操作。

  在使用Core Data进⾏行数据库存取并不须要手动创建数据库。创建数据库的过程全然由Core Data框架自己主动完毕。开发人员须要做的就是把模型创建起来,详细数据库的创建不须要管。

简单点说。Core Data实际上是将数据库的创建、表的创建、对象和表的转换等操作封装起来,极大的简化了我们的操作。

  Core Date与SQLite相比較,SQLite比較原始,操作比較复杂,使用的是C的函数对数据库进行操作,可是SQLite可控性更强,而且可以跨平台。

  以下,让我们一起来学习一下Core Data的简单使用。

一、使用Core Data,加入实体和模型

  在创建项目的时候能够选择使用Core Data,项目创建成功后,会在AppDelegate类中自己主动加入相关代码,此外,还会自己主动生成一个数据模型文件JRCoreData.xcdatamodeld

AppDelegate.h

//  AppDelegate.h
// JRCoreData
//
// Created by jerei on 15-6-24.
// Copyright (c) 2015年 jerehedu. All rights reserved.
// #import <UIKit/UIKit.h>
#import <CoreData/CoreData.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext;
- (NSURL *)applicationDocumentsDirectory; @end

AppDelegate.m

//  AppDelegate.m
// JRCoreData
//
// Created by jerei on 15-6-24.
// Copyright (c) 2015年 jerehedu. All rights reserved.
// #import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
} - (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
} - (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
} - (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
} - (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
} - (void)applicationWillTerminate:(UIApplication *)application {
// 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];
} #pragma mark - Core Data stack @synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (NSURL *)applicationDocumentsDirectory {
// The directory the application uses to store the Core Data store file. This code uses a directory named "com.jerehedu.JRCoreData" in the application's documents directory.
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
} - (NSManagedObjectModel *)managedObjectModel {
// 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.
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"JRCoreData" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
} - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
} // Create the coordinator and store _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"JRCoreData.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this 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();
} return _persistentStoreCoordinator;
} - (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
} NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
} #pragma mark - Core Data Saving support - (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = 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();
}
}
} @end

  假设项目在创建的时候没有选择使用Core Data。可是在后面须要使用,那么须要手动的加入AppDelegate中的相关代码。此外,还须要手动加入一个Data Model文件

  创建Data Model文件时须要注意,文件名要与AppDelegate.m中managedObjectModel方法中提到的文件名相匹配。

  有了Data Model文件后。就能够在里面加入实体和关系,实际上就是向数据库中加入表格和建立表格之间的关联。加入实体如图所看到的:

  每一个学生有一个所在的班级,每一个班级中有多个学生。因此,学生和班级之间能够建立关系。

建立关系如图所看到的:

  建立关系之后,能够切换显示的样式。以图表的方式查看实体之间的关系,如图所看到的:

  完毕上述步骤,数据库中表格的创建就已经完毕,和使用SQLite比較,省略了sql语句以及调用C函数操作数据库的步骤。另外,在创建实体的时候不须要设置主键,实体对象的属性的类型是OC的类型,实体中其它实体对象类型是通过建立关系加入的。

  创建好实体后。能够通过加入NSManagedObject subclass文件,系统能够自己主动加入实体相应的数据模型类,如图所看到的:

二、通过代码实现数据库的操作

  1、 向学生表中插入一条数据

  在使用Core Data的时候,AppDelegate中加入了NSManagedObjectContext对象。须要获得这个管理对象的上下文来进行操作。在操作的过程中。须要得到NSManagedObject实体,然后通过kvc设置实体的属性值,最后通过上下文调用save方法保存数据。

- (void)insert {

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    //1. 获得context
NSManagedObjectContext *context = delegate.managedObjectContext;
//2. 找到实体结构,并生成一个实体对象
/*
NSEntityDescription实体描写叙述,也就是表的结构
參数1:表名字
參数2:实例化的对象由谁来管理。就是context
*/
NSManagedObject *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context]; NSManagedObject *class1 = [NSEntityDescription insertNewObjectForEntityForName:@"Classes" inManagedObjectContext:context];
[class1 setValue:[NSNumber numberWithInt:1] forKey:@"c_id"];
[class1 setValue:@"一班" forKey:@"c_name"]; //3. 设置实体属性值
[stu setValue:[NSNumber numberWithInt:1] forKey:@"s_id"];
[stu setValue:@"jerehedu" forKey:@"s_name"];
[stu setValue:class1 forKey:@"s_class"]; //4. 调用context,保存实体,假设没有成功。返回错误信息
NSError *error;
if ([context save:&error]) {
NSLog(@"save ok");
}
else
{
NSLog(@"%@",error);
}
}

  2、查询学生表中所有数据

  查询与插入数据操作类似,可是多了构造查询对象的步骤。查询得到结果集是一个数组。遍历数组。能够取出查询数据。

- (void)selectAll {
AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = delegate.managedObjectContext; NSEntityDescription *stu = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]; //构造查询对象
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:stu]; //运行查询。返回结果集
NSArray *resultAry = [context executeFetchRequest:request error:nil]; //遍历结果集
for (NSManagedObject *enity in resultAry) {
NSLog(@"id=%i name=%@ class=%@",[[enity valueForKey:@"s_id"] intValue],[enity valueForKey:@"s_name"],[[enity valueForKey:@"s_class"] valueForKey:@"c_name"]);
}
}

  3、查询指定条件的学生信息,并更新

  指定条件的查询除了须要构造查询对象。还须要把查询的条件用谓词表示。然后遍历查询结果数组中的数据。进行更行,并保存。

- (void)update
{
// 更新 (从数据库找到-->更新)
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext; NSEntityDescription *stu = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]; NSFetchRequest *request = [NSFetchRequest new];
[request setEntity:stu]; //构造查询条件。相当于where子句
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"s_id=%i",1]; //把查询条件放进去
[request setPredicate:predicate]; //运行查询
NSArray *studentAry = [context executeFetchRequest:request error:nil];
if (studentAry.count>0)
{
//更新里面的值
NSManagedObject *obj = studentAry[0];
[obj setValue:@"apple" forKey:@"s_name"];
}
[context save:nil]; //显示
[self selectAll];
}

  4、删除指定条件的学生信息

  删除之前首先须要依据条件进行查询。查询到数据后删除,并保存。

- (void)delete
{
//删除 先找到,然后删除
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext; NSEntityDescription *stu = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]; NSFetchRequest *request = [NSFetchRequest new];
[request setEntity:stu]; //构造查询条件,相当于where子句
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"s_id=%i",1]; //把查询条件放进去
[request setPredicate:predicate];
//运行查询
NSManagedObject *obj = [[context executeFetchRequest:request error:nil] lastObject];
//删除
if (obj) {
[context deleteObject:obj];
[context save:nil];
} [self selectAll];
}
三、小结

  Core Data是苹果官方推荐使用的数据持久化方式。在使用的过程中,不须要导入数据库框架,也不须要使用sql语句操作数据库,全然是依照面向对象的思想。使用实体模型来操作数据库。在使用的过程中须要注意的是。假设模型发生了变化。可以选择又一次生成实体类文件,可是自己主动生成的数据库并不会自己主动更新。须要考虑又一次生成数据库。并把之前数据库中数据进行移植。Core Data可以简化操作。可是它不支持跨平台使用,假设想实现跨平台,就须要使用SQLite来进行数据持久化。

  疑问咨询或技术交流,请增加官方QQ群: (452379712)

作者:杰瑞教育

出处:http://blog.csdn.net/jerehedu/ 

本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有。欢迎转载。但未经作者允许必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

IOS 数据存储之 Core Data具体解释的更多相关文章

  1. IOS 数据存储之 Core Data详解

    Core Date是ios3.0后引入的数据持久化解决方案,它是是苹果官方推荐使用的,不需要借助第三方框架.Core Date实际上是对SQLite的封装,提供了更高级的持久化方式.在对数据库操作时, ...

  2. iOS开发之数据存储之Core Data

    1.概述 Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,不需要 ...

  3. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  4. iOS开发过程中使用Core Data应避免的十个错误

    原文出处: informit   译文出处:cocoachina Core Data是苹果针对Mac和iOS平台开发的一个框架,主要用来储存数据.对很多开发者来说,Core Data比较容易入手,但很 ...

  5. iOS数据存储之对象归档

    iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...

  6. iOS数据存储类型 及 堆(heap)和栈(stack)

    iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...

  7. 最全的iOS数据存储方法

    目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...

  8. IOS 数据存储之 FMDB 详解

    FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过 ...

  9. iOS数据存储简要笔记

    1.  数据存储常用的方式 (1)XML 属性列表(plist)归档 (2)preference(偏好设置) (3)NSKeyedArchiver归档(NSCoding) (4)  SQLite3   ...

随机推荐

  1. jquery.ajax之beforeSend方法使用介绍

    常见的一种效果,在用ajax请求时,没有返回前会出现前出现一个转动的loading小图标或者“内容加载中..”,用来告知用户正在请求数据.这个就可以用beforeSend方法来实现. 下载demo:a ...

  2. Linux命令运行监测和软件安装

    监测命令的运行时间 time command $ time sleep 5 real 0m5.003s # 程序开始至结束的时间,包括其它进程占用的时间片和IO时间 user 0m0.001s # 进 ...

  3. PHP图像函数

    (1)常见的验证码哪些?   图像类型.语音类型.视频类型.短信类型等 (2)使用验证码的好处在哪里? ①防止恶意的破解密码如一些黑客为了获取到用户信息,通过不同的手段向服务器发送数据,验证猜测用户信 ...

  4. <MyBatis>入门四 传入的参数处理

    1.单个参数 传入单个参数时,mapper文件中 #{}里可以写任意值 /** * 传入单个参数 */ Employee getEmpById(Integer id); <!--单个参数 #{} ...

  5. Python学习-变量

    什么是变量? 概念:变量就是会变化的量,主要是“变”与“量”二字.变即是“变化”. 特点:与其他编程语言相同,变量是最基本的存储单位,是用来存放数据的容器.可以引用一个具体的数值,进而直接去改变这个引 ...

  6. Thunderbird and Gmail

    https://support.mozilla.org/en-US/kb/thunderbird-and-gmail

  7. Maven学习总结(32)——Maven项目部署到Tomcat8中

    1.环境准备 Maven.Tomcat8.Eclipse 2.maven中的镜像配置 大家知道,mavne默认使用的是国外的镜像,但是速度很慢,这里建议大家使用阿里的中央仓库镜像. 阿里出品,必出精品 ...

  8. 我安装android studio的过程与经历

    虽然android studio已经出来两年多了,但是我一直都没真正用过.之前用Eclipse还算用得挺好.我并不是一个专职的android开发者,我是个游戏开发者,打包的时候要用到android.不 ...

  9. ios 7以后 隐藏顶部状态栏

    iOS 7 以后,之前隐藏顶部状态栏的方法都已经失效.以下介绍的方法是全部兼容的. 修改xode工程里的 Info.plist 增加 Status bar is initially hidden一行, ...

  10. Cow Sorting POJ 3270 & HDU 2838

    题目网址:http://poj.org/problem?id=3270 题目大意是:一串无序的数字,要排成增序的数列,可以交换不相邻的数,每交换两个数,sum+这两个数,使得sum最小,求最小的sum ...