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 <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@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");
}
看下能否和你预期的一样,如果数据处理没什么问题了那就更好的关注其他业务逻辑的处理了