iOS基础-CoreData--使用总结关联操作

1523603-f09d7061c5730cb8.png
东风不与周郎便,铜雀春深锁二乔!<太阳珊瑚>

  • <big>CoreData</big> 数据持久化框架是Cocoa API的一部分,它允许按照 实体-属性-值 模型组织数据,并以XML(做MAC-os用), 二进制, 或者SQLite数据文件的格式持久化数据. CoreData主要提供 对象-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化成OC对象.

  • CoreData与SQLite区别 :
  • CoreData是官方推出的数据持久化框架,SQLite是苹果使用别人开发好的一个动态库,本质是关系型数据库.
  • CoreData是iOS平台下的一个数据持久化的方式,不可以跨平台使用,Sqlite可以跨平台使用.
  • ---- CoreData -----
    1: 可视化,不用再写 SQL 语句,大量简化代码.
    2: 可以实现多种文件格式 : NSSQLLiteStoreType, BSXMLStoreType 等
    3: 与iOS紧密结合, 只能用于开发iOS.
    4: 存储内容, 以对象的形式存储, 符合面向对象的思想.
  • ---- SQLite ----
    1: 是一个轻量级数据库而且功能强大的关系型数据库, 很容易被嵌入到应用当中, 可移植性高, 可以在多个平台使用.
    2: 和CoreData 不一样的是, SQLite 是使用程序式的.sql的主要操作方法,是直接操作数据
    3: 基于C接口, 使用SQL语句, 代码繁琐.
    4: 在处理大量数据时,表关系更直观一些,
    5: OC中不是可视化的
  • 核心对象:

NSPersistentStoreCoordinator 数据连接器类(中间人,不能直接控制)
NSManagedObjectContext 数据管理器类 (临时数据库 )
NSManagedObject 数据管理类
NSManagedObject 数据模型器类
NSEntityDescription 实体描述类

  • NSManagedObjectContext (被管理的上下文)
    1: 操作实际内容 (对持久层的一个操作)
    2: 插入数据, 查询数据, 删除数据,修改数据
    3: 是我们开发中主要交互的类, 数据的CRUD都通过这个Context(上下文)去触发命令并返回结果.
  • NSManagedObjectModel (被管理的数据模型)
    1: 包含了各个实体(表)的定义信息, 包含了表或者是数据库的结构.
    2: 用来添加实体的属性,建立属性之间的关系.
    3: 操作方法: 视图编辑器,也可以用代码.
    4: 构建整个数据库的表结构, 表字段类型, 表与表之间的关系等等, 凡是和数据结构有关系的定义, 通通都通过这个类来管理.

  • NSPersistentStoreCoordinator (持久化数据助理)
    1: 相当于数据库的连接器
    2: 作用: 设置数据存储的名字, 位置,存储方式, 存储时机.
    3: 原理: 从下层文件取出数据, 交给上层的被管理的对象上下文
    4: 实际上这个类才是真正意义上跟数据库(.sqlite文件)打交道的,主要是根据 NSManagedObjectModel 执行表结构的建立通过 NSManagedObjectContext的命令执行数据交互.

  • 操作的思想流程:

context想要获取值,先要告诉连接器,我要什么东西,连接器再告诉store,你给我什么东西,store去找,找到之后返回给context.

1523603-3c9dbe7d710c9654.png
CoreData核心关系类

CoreData 数据库的简单操作:

.xcdatamodeld里:
1523603-14e3e8b29a3a8535.png
  1. Add Entity 添加实体类
  1. 修改实体类名
  2. 修改属性名与类型
  3. 创建文件 command+N —> CoreData —> NSManageObjuect subclass

一般使用的步骤:

// 导入CoreData框架
// 导入需要的类


#import <CoreData/CoreData.h>
#import "Person.h"
#import "AppDelegate.h"

第一步: 当前自身的数据库连接器与APP的绑定

//通过单例的代理协议的代理人,获取到我们最开始使用的 AppDelegate 

    AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
//获得 数据库的数据连接器 (定义一个`@property (nonatomic, strong) NSManagedObjectContext *objectContext;`)

    self.objectContext = app.managedObjectContext;
  • 向数据库添加数据:

方式1:
/NSEntityDescription :实体描述类,通过类方法创建
//参数1 :表示这个实体描述类描述的是哪个实体
//参数2 :表示的是在context里创建一个描述,告诉context我要往里面插入以object了
NSEntityDescription *description = [NSEntityDescriptionentityForName:@"Person" inManagedObjectContext:self.objectContext];
//创建一个实体类
//参数1 :实体类描述
//参数2 :在context里放入这个类
Person person = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:self.objectContext];
方式2: 上面的两步骤合并为一个步骤
/

Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.objectContext];
/
//把context保存到本地
//这个方法执行之后,本地数据才发生改变
NSError
error =nil;
[self.objectContext save:&error];
if(error ==nil)
{
NSLog(@"保存正确"); // 可以再次重新加载数据
}else
{
NSLog(@"错误%@",error);
}

- 删除数据
>```code
// 获取想要删的数据 依情况而定
Person *person = self.dataArray[indexPath.row];      
// 在context中将这条数据删除
  [self.objectContext deleteObject:person];
   NSError *error = nil; 
// 保存一下
  [self.objectContext save:&error];               
if (error == nil) { 
NSLog(@"删除成功");
 }```

- 修改数据
>```code
  // 知道改谁  找到你要改的对象
    Person *person = self.dataArray[indexPath.row];
// 修改值    
int number = arc4random() % 2000;
person.name = [NSString stringWithFormat:@"%d 好", number];   
// 保存修改的东西到数据库
NSError *error = nil;
[self.objectContext save:&error];
 if (error == nil) 
{ 
NSLog(@"修改成功了");
}   
  • 查询数据

//创建一个查询操作,查询哪个表里的内容
NSFetchRequestrequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
//接收查询数据
NSError
error =nil;
// 返回的是一个查询结果的数组所以接收一下
NSArray*array = [self.objectContext executeFetchRequest:request error:&error];
//判断error
if(error ==nil) {
//如果是,那就查到成功 可以放到dataArray里面然后去加载视图显示 可以通过谓词按照你的需求去查找
NSLog(@"查找成功!");
}



------------------
多表的关联
--------------

















![](http://upload-images.jianshu.io/upload_images/1523603-bb23784e6b24dd72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1523603-708c69d7eb4b4925.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)















![](http://upload-images.jianshu.io/upload_images/1523603-192a931d8284a4f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




![](http://upload-images.jianshu.io/upload_images/1523603-a10ba49d8614c0d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)






![](http://upload-images.jianshu.io/upload_images/1523603-82d7510c0611d0b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值