一、简介

Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库。在实际开发中绝大部分情况下,Core Data底层都采用SQLite数据库作为持久化存储方式。它也允许把数据保存在内存中(设备重启后数据会丢失),也允许把数据存储为其他格式(如XML)。简单的讲,它就是用于操作实体以及实体之间的关联关系的持久化工具。

二、Core Data的核心概念。

1、实体

实体就是由Core Data管理的模型对象,是NSManagedObject类或其子类的实例。

实体与实体之间是1-1、1-N、N-N的关联关系。

2、实体描述

NSEntityDescription:该对象描述了实体的具体信息(如包含的所有属性等),相当于实体的抽象。

3、托管对象模型

NSManagedObjectModel:该对象负责管理所有实体以及实体之间的关联关系。一个托管对象模型对应一个数据库。

4、托管对象上下文

NSManagedObjectContext:简称上下文,一个上下文管理一个数据库,如果需要多个数据库则需要创建多个上下文。所有实体都处于所在上下文的管理中,实体的增、删、改、查操作都必须通过该对象来完成。类似于Hibernate的Session。

5、持久化存储协调器

NSPersistentStoreCoordinator:底层与NSManagedObjectContext相衔接,负责管理底层的存储形式(如SQLite数据库或XML等)。

6、抓取请求

NSRetchRequest:该对象封装了查询实体的请求,例如需要查询哪些实体、查询条件(通过NSPredicate来表示)、排序规则(用NSArray定义了所有的排序规则)等。

三、使用Core Data的步骤。

注:创建项目时如果勾选"Use Core Data"复选框,Xcode会自动完成所有Core Data必需资源的初始化,前3步会自动完成,此时需从第4步开始操作。

1、为项目导入CoreData.Framework框架。

2、添加实体模型文件。

Xcode → File → New → File → Data Model → next → "实体模型文件名".xcdatamodeld → create;

3、初始化Core Data必需的核心API对象,这些是属于全局对象,一般会在AppDelegate中操作。

(1)、在AppDelegate.h中添加3个核心属性,再添加一个执行存储的方法。

 #import <UIKit/UIKit.h>
#import <CoreData/CoreData.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext; @end

(2)、在AppDelegate.m中初始化NSManagedObjectModel。

 - (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData2" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}

(3)、以NSManagedObjectModel对象为基础,在AppDelegate.m中初始化NSPersistentStoreCoordinator,用于设置Core Data底层数据存储方式。

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
storeURL = [storeURL URLByAppendingPathComponent:@"CoreData2.sqlite"];
NSError *error = nil;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
} return _persistentStoreCoordinator;
}

(4)、以NSManagedObjectModel对象为基础,在AppDelegate.m中初始化NSManagedObjectContext。

 - (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext != nil) {
return _managedObjectContext;
} NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}

(5)、在AppDelegate.m中实现saveContext方法,用于保存数据。

 - (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}

(6)、在AppDelegate.m中实现此方法,当应用在后台被终止时,保存上下文中的数据。

 - (void)applicationWillTerminate:(UIApplication *)application {
[self saveContext];
}

经过以上3大步骤,Core Data项目初始化完成,当应用程序需要执行增、删、改、查等操作时,直接调用AppDelegate中的managedObjectContext属性即可操作。

4、设计实体模型。

单击Xcode项目导航中的"实体模型文件名".xcdatamodeld文件,打开实体模型开始编辑。

(1)、实体:是实体模型的核心对象,实体必需是NSManagedObject类或其子类。点击"Add Entity"添加实体。

(2)、抓取请求:是NSFetchRequest对象,实际开发中通常会在代码中创建。

(3)、配置:系统默认配置,无需自行添加。

(4)、属性:相当于实体对象的实例变量,在实体列表中选中刚生成的实体,点击"Add Attribute"添加属性。

(5)、关联关系:定义实体之间的关联关系,如1-1、1-N、N-N。具体操作如下:

选中实体 → 在Relationships下点击加号添加关联关系  → 在Relationship下填写关联关系名称 → 在Destination下选择目标实体 → 在Xcode属性面板的Type中选择关联类型 → 在Xcode属性面板的Delete Rule中选择级联类型。

  • Relationship:关联关系的名称。
  • Destination:关联关系的目标实体。
  • Inverse:建立实体与目标实体之间的关联关系,保持数据的完整性,不设置的话编译器会有警告。
  • Type中的To One:1-1.
  • Type中的To Many:1-N。                           // N-N的情况需设置其他的实体对此实体为1-N
  • Delete Rule的No Action:当主实体被删除时,关联的目标实体不变。
  • Delete Rule的Nullify:当主实体被删除时,关联的目标实体外键值被设置为null。
  • Delete Rule的Cascade:当主实体被删除时,关联的目标实体也被级联删除。
  • Delete Rule的Deny:当主实体被删除时,如果被关联的目标实体还存在,程序会拒绝删除主实体的操作。必需先删除关联的目标实体,才能删除主实体。

(6)、抓取属性:在获取关联实体时可执行某个过滤条件。

5、用实体模型生成实体。

即以"实体模型文件名".xcdatamodeld文件中的某个实体为基础,为该实体生成NSManagedObject的子类。

Xcode → File → New → File → NSManagedObject Subclass → 选择实体模型文件 → 选择文件中的实体(大于1个时) → create;

6、实现数据的增、删、改、查。

(1)、添加实体。

  • 调用NSEntityDescription的insertNewObjectForEntityForName:inManagedObjectContext:类方法添加新实体。
  • 设置新实体属性。
  • 调用NSManagedObjectContext对象的save方法保存上下文。

     HLAuthor *author = [NSEntityDescription insertNewObjectForEntityForName:@"HLAuthor" inManagedObjectContext:self.appDelegate.managedObjectContext];
    author.name = @"张三";
    author.authorDesc = @"xxx";
    NSError *error = nil;
    if (![self.appDelegate.managedObjectContext save:&error]) {
    NSLog(@"保存失败:%@, %@", error, error.userInfo);
    }

(2)、删除实体。

  • 获取要删除的实体。
  • 调用NSManagedObjectContext对象的deleteObject:方法删除实体。
  • 调用NSManagedObjectContext对象的save方法保存上下文。
     HLAuthor *author = self.authorArray[indexPath.row];
    [self.appDelegate.managedObjectContext deleteObject:author];
    NSError *error = nil;
    if (![self.appDelegate.managedObjectContext save:&error]) {
    NSLog(@"删除失败:%@, %@", error, error.userInfo);
    }

(3)、修改实体。

  • 获取要修改的实体。
  • 修改实体属性。
  • 调用NSManagedObjectContext对象的save方法保存上下文。
     HLAuthor *author = .....;
    author.name = .....;
    author.authorDesc = .....;
    NSError *error = nil;
    if ([self.delegate.managedObjectContext save:&error]) {
    NSLog(@"修改失败:%@, %@", error, error.userInfo);
    }

(4)、查询实体。

  • 创建NSFetchRequest对象。
  • 通过NSEntityDescription对象,设置NSFetchRequest对象所要抓取的实体。
  • 通过NSFetchRequest对象的FetchOffset属性,可以设置分页的起始索引。
  • 通过NSFetchRequest对象的fetchLimit属性,可以设置每页的条数。
  • 通过NSPredicate对象,可以设置筛选条件。
  • 通过NSSortDescriptor对象,可以设置查询结果的排序规则。
  • 调用NSManagedObjectcontext对象的executeFetchRequest:error:方法执行查询,返回所有符合条件的结果集NSArray。
     NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"author" inManagedObjectContext:self.appDelegate.managedObjectContext];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"nane = %@", @"张三"];
    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    request.entity = entity;
    request.predicate = predicate;
    request.sortDescriptors = @[descriptor];
    NSError *error = nil;
    NSArray *result = [self.appDelegate.managedObjectContext executeFetchRequest:request error:&error];

Core Data的一些常见用法的更多相关文章

  1. SELF, self in CORE DATA

    Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...

  2. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  3. find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  4. [转]Linux中find常见用法示例

    Linux中find常见用法示例[转]·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;find命令的参 ...

  5. Core Data & MagicalRecord

    iOS 本地数据持久化存储: 1.plist 2.归档 3.NSUserDefaults 4.NSFileManager 5.数据库 一.CoreData概述 CoreData是苹果自带的管理数据库的 ...

  6. iOS之Core Data及其线程安全

    一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...

  7. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  8. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  9. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

随机推荐

  1. mysqldump的实现原理

    对于MySQL的备份,可分为以下两种: 1. 冷备 2. 热备 其中,冷备,顾名思义,就是将数据库关掉,利用操作系统命令拷贝数据库相关文件.而热备指的是在线热备,即在不关闭数据库的情况下,对数据库进行 ...

  2. C算法编程题(五)“E”的变换

    前言 上一篇<C算法编程题(四)上三角> 插几句话,说说最近自己的状态,人家都说程序员经常失眠什么的,但是这几个月来,我从没有失眠过,当然是过了分手那段时期.每天的工作很忙,一个任务接一个 ...

  3. IOS 整体架构 和 MVC布局

    IOS的生态系统 IOS生态系统不仅仅是指产品,更重要的是指 iPhone/iPad/iPod/Mac +iCloud+App整个系统,包括Siri (部分设备不支持).FaceTime.Safari ...

  4. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  5. 2.第一个Struts2程序-HelloWorld程序

    1.新建Web Project项目:Study_Struts2 2.新建HelloWordAction.java类 3.复制struts.xml文件到src目录下,配置struts.xml文件内容如下 ...

  6. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  7. SQL Server里的文件和文件组

    在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个 ...

  8. do{...}while(0)的妙用

    在学习第一门编程语言时,就已经介绍了顺序分支.条件分支.循环分支.比如循环分支有for.while.do-while语句.在随后的学校及工作中,如果手工循环一般使用for.while,很少使用do-w ...

  9. MVC学习系列12---验证系列之Fluent Validation

    前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便.而客 ...

  10. Rafy 领域实体框架演示(4) - 使用本地文件型数据库 SQLCE 绿色部署

    本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...