无标题文章

(1)NSManagedObjectContext(被管理的数据上下文)

操作实际内容(操作持久层)

作用:插入数据,查询数据,删除数据

(2)NSManagedObjectModel(被管理的数据模型)

数据库所有表格或数据结构,包含各实体的定义信息

作用:添加实体的属性,建立属性之间的关系

操作方法:视图编辑器,或代码

(3)NSPersistentStoreCoordinator(持久化存储助理)

相当于数据库的连接器

作用:设置数据存储的名字,位置,存储方式,和存储时机

(4)NSManagedObject(被管理的数据记录)

相当于数据库中的表格记录

(5)NSFetchRequest(获取数据的请求)

相当于查询语句

(6)NSEntityDescription(实体结构)

相当于表格结构

(7)后缀为.xcdatamodeld的包

里面是.xcdatamodel文件,用数据模型编辑器编辑

编译后为.momd或.mom文件

1.自定义封装的 CoreData管理类HMTCoreDataManager

.h

#import

#import

/**

*  数据存储成功的代码块

*/

typedef void(^HandleSaveSuccessedBlock)();

/**

*  数据存储失败的代码块

*/

typedef void(^HandleSaveFailedBlock)(NSError *);

@interface HMTCoreDataManager : NSObject

@property (nonatomic,strong)NSManagedObjectContext *managedObjectContext;  //  托管对象上下文

/**

*  创建一个单例对象

*

*  @return 单例对象

*/

+ (HMTCoreDataManager *)defaultManager;

/**

*  根据实体描述获得托管对象

*

*  @param entityName  指定实体描述名字

*  @param aClass      要获取的托管对象

*

*  @return  托管对象实例

*/

- (NSManagedObject *)managedObjectWithEntityName:(NSString *)entityName managedObjectClass:(Class)aClass;

/**

*  数据存储到磁盘中成功和失败响应的方法,参数为2个block

*

*  @param aSuccessedHandler

*  @param aFailedHandler

*/

- (void)saveWithSuccessedHandler:(HandleSaveSuccessedBlock)aSuccessedHandler failedHandler:(HandleSaveFailedBlock)aFailedHandler;

//  插入数据

- (void)insertCoreData;

//  查询

- (NSMutableArray*)selectData:(NSString *)name;

//  删除

- (void)deleteData:(NSManagedObject *)object;

//  更新

- (void)updateData:(NSString* )newName;

@end

.m

#import "HMTCoreDataManager.h"

@interface HMTCoreDataManager ()

@property (nonatomic,strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;  //  持久化存储协调器

@property (nonatomic,strong) NSManagedObjectModel * managedObjectModel;  //  托管对象模型

@end

@implementation HMTCoreDataManager

static HMTCoreDataManager *manager = nil;

+ (HMTCoreDataManager *)defaultManager{

@synchronized(self){

if (manager == nil) {

manager = [[HMTCoreDataManager alloc] init];

}

}

/*

//  通过GCD创建

static dispatch_once_t onceToken;

dispatch_once(&onceToken,^{

manager = [[HMTCoreDataManager alloc] init];

});

*/

return manager;

}

#pragma mark - 属性的方便之处能在get方法中初始化

/**

*  很多人对于这个上下文不太理解,开始我也不太理解,查了很多资料,感觉下面这个解释比较通俗易懂

*  托管对象上下文:

*  托管对象上下文包含所有的托管对象,这些托管对象已经为提交给数据库准备就绪,在托管对象上下文中,可以添加、修改和删除托管对象,

*  这一层相当于应用程序和数据库之间的缓冲区。

*/

- (NSManagedObjectContext *)managedObjectContext{

if (_managedObjectContext) {

return _managedObjectContext;

}

_managedObjectContext = [[NSManagedObjectContext alloc] init];

//  为托管对象上下文指定一个持久化存储协调器

[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];

return _managedObjectContext;

}

/**

*  持久化存储协调器(持久化存储助理)

*  持久化存储协调器处理到数据存储的连接,并且包含一些底层信息,像用到数据存储的名字和位置

*  一般我们无需与它直接打交道,上下文已经封装了对它的调用

*/

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{

if (_persistentStoreCoordinator) {

return _persistentStoreCoordinator;

}

//  初始化一个持久化存储协调器必须依赖NSManagedObjectModel

_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

//  存储路径(返回的是NSURL类型)为Documents目录下,以及数据库名称

NSURL *documentURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

NSURL *fileURL = [documentURL URLByAppendingPathComponent:@"myClass.sqlite"];

NSError *error = nil;

//  加载持久化存储数据(指定持久化存储的数据类型,默认的是NSSQLiteStoreType,即SQLite数据库)

[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:&error];

if (error != nil) {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"添加持久化存储失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

[alert show];

}

return _persistentStoreCoordinator;

}

/**

*  托管对象模型

*  数据库所有表格或数据结构包含各实体的定义信息

*  添加实体的属性,建立属性之间的关系

*/

- (NSManagedObjectModel *)managedObjectModel{

if (_managedObjectModel) {

return _managedObjectModel;

}

//  获取托管对象模型文件的地址

//  编译器会自动将"xcdatamodeld"格式转化为"momd"

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myClassModel" withExtension:@"momd"];

_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

return _managedObjectModel;

}

- (NSManagedObject *)managedObjectWithEntityName:(NSString *)entityName managedObjectClass:(Class)aClass{

//  创建"HMTClass"的实体描述

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"HMTClassEntity" inManagedObjectContext:self.managedObjectContext];

//  通过"HMTClass"的实体描述创建HMTClass的托管对象

NSManagedObject *managedObject = [[aClass alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:self.managedObjectContext];

return managedObject;

}

- (void)saveWithSuccessedHandler:(HandleSaveSuccessedBlock)aSuccessedHandler failedHandler:(HandleSaveFailedBlock)aFailedHandler{

NSError *error = nil;

[self.managedObjectContext save:&error];

if (error != nil) {

aFailedHandler(error);

}else {

aSuccessedHandler();

}

}

@end

2. 创建模型文件ManagedObject的过程

3.将创建的模型文件转化为对应的类文件

第一种:command+n

第二种: 选中myClassModel.xcdatamodeld

之后都是一样的--->选中模型文件--->选中要创建的实体

最后,就会生成前面图片中的3个类,都是继承了 NSManagedObject

------------------class-------------------------------

@class HMTStudent, HMTTeacher;

@interface HMTClass : NSManagedObject

@property (nonatomic, retain) NSString * name;

@property (nonatomic, retain) NSSet *students;

@property (nonatomic, retain) HMTTeacher *teacher;

@end

@interface HMTClass (CoreDataGeneratedAccessors)

- (void)addStudentsObject:(HMTStudent *)value;

- (void)removeStudentsObject:(HMTStudent *)value;

- (void)addStudents:(NSSet *)values;

- (void)removeStudents:(NSSet *)values;

@end

#import "HMTClass.h"

#import "HMTStudent.h"

#import "HMTTeacher.h"

@implementation HMTClass

@dynamic name;

@dynamic students;

@dynamic teacher;

@end

------------------teacher-------------------------------

@class HMTClass;

@interface HMTTeacher : NSManagedObject

@property (nonatomic, retain) NSString * name;

@property (nonatomic, retain) NSString * course;

@property (nonatomic, retain) HMTClass *myClass;

@end

#import "HMTTeacher.h"

#import "HMTClass.h"

@implementation HMTTeacher

@dynamic name;

@dynamic course;

@dynamic myClass;

@end

------------------student-------------------------------

@class HMTClass, HMTTeacher;

@interface HMTStudent : NSManagedObject

@property (nonatomic, retain) NSString * name;

@property (nonatomic, retain) NSNumber * age;

@property (nonatomic, retain) HMTTeacher *teacher;

@property (nonatomic, retain) HMTClass *myClass;

@end

#import "HMTStudent.h"

#import "HMTClass.h"

#import "HMTTeacher.h"

@implementation HMTStudent

@dynamic name;

@dynamic age;

@dynamic teacher;

@dynamic myClass;

@end

4.准备工作都OK了,最后进行数据的持久化存储

#pragma mark - 增删改查

//  插入数据操作(类似于FMDB做法,方法后面可带你想存储的数据对象,这里只是单纯的演示)

//  - (void)insertCoreData:(AppleClass *)appleClass

- (void)insertCoreData{

//  创建"HMTClass"的实体描述,传入的正是前面标注的实体描述名

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"HMTClassEntity" inManagedObjectContext:self.managedObjectContext];

//  通过"HMTClass"的实体描述创建HMTClass的托管对象

HMTClass *hmtClass = [[HMTClass alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:self.managedObjectContext];

//  hmtClass.name = appleClass.name;

hmtClass.name = @"Apple";

//  托管对象上下文将托管对象的更改保存到磁盘文件中

//  - save  将数据保存到数据库

NSError *error = nil;

[self.managedObjectContext save:&error];

if (error != nil) {

NSLog(@"添加失败:%@",[error localizedDescription]);

}

}

//  删除数据操作

- (void)deleteData:(NSManagedObject *)object{

[self.managedObjectContext deleteObject:object];

NSError *error = nil;

[[HMTCoreDataManager defaultManager].managedObjectContext save:&error];

if (error != nil) {

NSLog(@"删除失败:%@",[error localizedDescription]);

}

}

//  查询数据操作(依据特定条件查询,如果是select * 就直接不写谓词判断语句)

- (NSMutableArray*)selectData:(NSString *)name{

//  创建指定Entity的查询语句

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"HMTClassEntity"];

//  谓词,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取(我blog中OC分类有具体讲到)

NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name == \'%@\'",name],nil];

fetchRequest.predicate = predicate;

//  查询的结果按哪个key进行排序,YES为升序

// NSSortDescriptor *timestampSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"classNO" ascending:YES];

// fetchRequest.sortDescriptors = @[timestampSortDescriptor];

//  注意查询返回的只能是NSArray类型

NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

NSMutableArray *resultArray = [NSMutableArray arrayWithArray:fetchedObjects];

return resultArray;

}

//  更新数据操作

- (void)updateData:(NSString *)newName{

//  创建指定Entity的查询语句

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"HMTClassEntity"];

//  注意查询返回的只能是NSArray类型

NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

//  更新

for (HMTClass *info in fetchedObjects) {

info.name = newName;

}

//保存

if ([self.managedObjectContext save:nil]) {

//更新成功

NSLog(@"更新成功");

}

}

@转载请注明:http://blog.csdn.net/hmt20130412  谢谢!

@不错的CoreData资料:

http://blog.csdn.net/rhljiayou/article/details/18037729

http://blog.csdn.net/kesalin/article/details/6739319

http://www.cnblogs.com/mybkn/articles/2472881.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,690评论 0 9
  • 【2017年最新】☞ iOS面试题及答案 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经...
    紫色冰雨阅读 598评论 0 1
  • http://blog.csdn.net/david21984/article/details/57451917 ...
    紫色冰雨阅读 551评论 0 0
  • [更新日志][1] [1]: https://blog.growingio.com/posts/iOS_chan...
    bmm_yj阅读 688评论 0 0
  • 今天看到一幅水彩很美,就马上临摹了,做了小改动,原画画了一只鸭子,我改成了两只天鹅,就叫它雪中的天鹅湖吧。
    LillianBi阅读 634评论 4 11