本文共 8023 字,大约阅读时间需要 26 分钟。
CoreData是一种对象关系模型,要比普通的关系模型先进高效,不存在“匹配阻抗”问题
首先CoreData有三个重要的属性
NSManagedObjectContext--管理对象的上下文
NSManagedObjectModel--对象的管理模型
NSPersistentStoreCoordinator--数据持久化的协调器
在常规的增删改的过程中都需要用NSManagedObjectContex做最后的CoreData操作,用于实现将数据再次实例化,当然这个过程需要依赖下面的NSPersistentStoreCoordinator的帮助了,增删改的最后一步都是需要实现以下操作
if([self.managedObjectContext save:&savingError]) { NSLog(@"修改成功"); return 1; }用于持久化整个操作的数据模型
好了,我现在讲下如何来一步步的创建CoreData并且使用相应的方法函数实现常规的操作
第一步,如果你所选的模板没有自带CoreData的话,你需要自己建立一个CoreData对象,注意的是,虽然自己建立的文件为xcdatamodeld文件,但是我们需要在寻找这个文件的时候用“momd”后缀名来访问,比如:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataNotes" withExtension:@"momd"];第二步,在CoreData文件中创建对象以及对象的属性,需要注意的是属性对象的数据类型必须和实体类的属性一致,换句话说实体类都是必须是简单属性,如果里面包含对象什么的,最好使用关联对象的方法
第三部,创建关联对象,我理解的关联对象就是需要和你所生成的CoreData中的对象产生一定的映射关系,我们在后面操作的时候就是操作这个关联对象,所以这个就必须要生成
第四步,实现CoreData需要属性的实例化
具体如下
#import#import @interface CoreDataDAO : NSObject//被管理的对象上下文@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;//被管理的对象模型@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;//持久化存储协调者@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (NSURL *)applicationDocumentsDirectory;@end
//// CoreDataDAO.m// ikw2//// Created by apple on 14-3-31.// Copyright (c) 2014年 com.tyust. All rights reserved.//#import "CoreDataDAO.h"@implementation CoreDataDAO@synthesize managedObjectContext = _managedObjectContext;@synthesize managedObjectModel = _managedObjectModel;@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;#pragma mark - Core Data 堆栈//返回 被管理的对象上下文- (NSManagedObjectContext *)managedObjectContext{ if (_managedObjectContext) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext;}// 返回 持久化存储协调者- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{ if (_persistentStoreCoordinator) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataNotes.sqlite"]; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:nil]; return _persistentStoreCoordinator;}// 返回 被管理的对象模型- (NSManagedObjectModel *)managedObjectModel{ if (_managedObjectModel) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataNotes" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel;}#pragma mark - 应用程序沙箱// 返回应用程序Docment目录的NSURL类型- (NSURL *)applicationDocumentsDirectory{ return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];}@end第六步:让你操作数据的类(NoteDao)继承上面CoreDataDAO
当完成以上步骤之后就可以进行数据的操作了(在NoteDao中进行)
(1)增
NSManagedObjectContext *cxt = [self managedObjectContext]; NoteManagedObject *note = [NSEntityDescription insertNewObjectForEntityForName:@"Notes" inManagedObjectContext:cxt]; [note setValue:model.content forKey:@"content"]; [note setValue:model.date forKey:@"date"]; NSError *error; if([self.managedObjectContext save:&error]) { NSLog(@"插入成功"); } else { NSLog(@"插入失败"); } return 0;(2)删
NSManagedObjectContext *cxt = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:cxt]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; [request setEntity:entityDescription]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date=%@",model.date]; [request setPredicate:predicate]; NSError *error; NSArray *listData = [cxt executeFetchRequest:request error:&error]; if([listData count]>0) { NoteManagedObject *object = [listData lastObject]; [self.managedObjectContext deleteObject:object]; NSError *error2; if([self.managedObjectContext save:&error2]) { NSLog(@"删除成功"); return 1; }else{ NSLog(@"删除失败"); return -1; } } return 0;(3)改
NSManagedObjectContext *cxt = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:cxt]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; [request setEntity:entityDescription]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date=%@",model.date]; [request setPredicate:predicate]; NSError *error; NSArray *listData = [cxt executeFetchRequest:request error:&error]; if(listData.count > 0) { NoteManagedObject *object = [listData lastObject]; object.content = model.content; NSError *savingError; if([self.managedObjectContext save:&savingError]) { NSLog(@"修改成功"); return 1; } } return 0;
(4.1)查All
NSManagedObjectContext *cxt = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:cxt]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; [request setEntity:entityDescription]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES]; [request setSortDescriptors:@[sortDescriptor]]; NSError *error; NSArray *listData = [cxt executeFetchRequest:request error:&error]; NSMutableArray *resListData = [[NSMutableArray alloc]init]; for (NoteManagedObject *mo in listData) { Note *note = [[Note alloc]init]; note.date = mo.date; note.content = mo.content; [resListData addObject:note]; } return resListData;(4.2)条件查询
NSManagedObjectContext *cxt = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Notes" inManagedObjectContext:cxt]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; [request setEntity:entityDescription]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date=%@",model.date]; [request setPredicate:predicate]; NSError *error; NSArray *array = [cxt executeFetchRequest:request error:&error]; if([array count]>0) { NoteManagedObject *mo = [array lastObject]; Note *n = [[Note alloc]init]; n.date = mo.date; n.content = mo.content; return n; } return nil;
最好写完操作数据库的步骤之后,进行单元测试,比如测试修改
-(void)testModify{ NoteDao *dao = [NoteDao sharedManager]; NSDateFormatter *formater = [[NSDateFormatter alloc]init]; [formater setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; NSDate *date = [formater dateFromString:@"2010-11-23 12:23:10"]; Note *note = [[Note alloc]initWithContent:@"帅哥美女么么哒----孙悟空" andDate:date]; int a = [dao modify:note]; XCTAssertEqual(a, 1, @"testModify");}看下能否和你预期的一样,如果数据处理没什么问题了那就更好的关注其他业务逻辑的处理了
转载地址:https://blog.csdn.net/xiaoji94shen/article/details/22658087 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!