iOS零碎知识iOS工程实践iOS数据库

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

2016-06-28  本文已影响1424人  云之君兮鹏

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


  • CoreData是官方推出的数据持久化框架,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(上下文)去触发命令并返回结果.

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

CoreData核心关系类

CoreData 数据库的简单操作:

.xcdatamodeld里:
  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)
上一篇下一篇

猜你喜欢

热点阅读