1. 今天的課程、 大家在學習之後肯定會有另一番想法、
至少、 你們會收藏我的博客吧、嘿嘿、 新開的人氣可不怎麼高
2. 好、 廢話不多說、 直接切入正題、 網上講coreData的有好多、 但大多數不怎麼細致、 也不會完整的敲代碼、
所以、 今天上午我自己簡單的封裝一下coreData供自己使用。 大家可以借鑒一下。 又不足之處還望指出。
3. 開始編碼:
1. 導入 coreData.FrameWork 我們今天封裝的東西、 不實用系統自帶的coreData、 而是導入庫自己去寫。 加深印象
思想: 單例 + 中間層 (中間層繼承於NSManagedObject 方便我們操作、 也有住於在業務量大的時候優化代碼)
總共4個文件 我們開始編碼:
1、單例 ADCoreData.h
//
// ADCoreData.h
// CoreData_CE
//
// Created by Dylan on 14-10-11.
// Copyright (c) 2014年 Dylan. All rights reserved.
//
/*!
* @Author Dylan.
*
* Please add CoreData.FrameWork
*/
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface ADCoreData : NSObject
/*!
* @Author Dylan.
*
* context
*/
@property (nonatomic, strong, readonly) NSManagedObjectContext * manageContext;
+ (instancetype)shareInstanceWithStoreName: (NSString *)storeName;
/*!
* @Author Dylan.
*
* Methods
*/
- (NSMutableArray *)findByModel: (id)model;
- (NSMutableArray *)findByModel: (id)model
predicateString: (NSString *)predicateString;
/*!
* Update
*/
- (BOOL)create: (id)model;
- (BOOL)remove: (id)model;
- (BOOL)remove: (id)model
predicateString: (NSString *)predicateString;
- (BOOL)modify: (id)model
predicateString: (NSString *)predicateString;
@end
ADCoreData.m
//
// ADCoreData.m
// CoreData_CE
//
// Created by Dylan on 14-10-11.
// Copyright (c) 2014年 Dylan. All rights reserved.
//
#import "ADCoreData.h"
#import "ADCoreDataManager.h"
#import <objc/runtime.h>
#define CLASS_NAME(PRAM) NSStringFromClass([PRAM class])
@interface ADCoreData ()
@property (nonatomic, strong) NSManagedObjectModel * managedobjectModel;
@property (nonatomic, strong) NSPersistentStoreCoordinator * persistentStoreCoordinator;
/*!
* @Author Dylan.
*
* storeName
*/
@property (nonatomic, strong) NSString * storeName;
- (NSURL *)applicationDomainUrl;
@end
static ADCoreData * coreData;
@implementation ADCoreData
+ (instancetype)shareInstanceWithStoreName:(NSString *)storeName {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
coreData = [[self alloc] init];
coreData.storeName = storeName;
});
return coreData;
}
/*!
* @Author Dylan.
*
* synthesize
*/
@synthesize manageContext = _manageContext;
@synthesize managedobjectModel = _managedobjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
#pragma mark -
#pragma mark - GET
- (NSManagedObjectContext *)manageContext {
if (_manageContext) {
return _manageContext;
}
NSPersistentStoreCoordinator * coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_manageContext = [[NSManagedObjectContext alloc] init];
[_manageContext setPersistentStoreCoordinator:coordinator];
}
return _manageContext;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator) {
return _persistentStoreCoordinator;
}
NSURL * storeUrl = [[self applicationDomainUrl] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", _storeName]];
_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:_storeName withExtension:@"momd"];
_managedobjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
return _managedobjectModel;
}
#pragma mark - Methods
- (NSMutableArray *)findByModel: (id)model {
NSError * error = nil;
NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:nil] error:&error];
NSMutableArray * resultArray = [NSMutableArray array];
for (ADCoreDataManager * manager in listArray) {
for (NSString * propertyName in [self ClassAttributes:model]) {
[model setValue:[manager valueForKey:propertyName] forKey:propertyName];
}
[resultArray addObject:model];
}
return resultArray;
}
- (NSMutableArray *)findByModel: (id)model
predicateString: (NSString *)predicateString; {
NSError * error = nil;
NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:predicateString] error:&error];
NSMutableArray * resultArray = [NSMutableArray array];
if (listArray.count >= 1) {
for (ADCoreDataManager * manager in listArray) {
for (NSString * propertyName in [self ClassAttributes:model]) {
[model setValue:[manager valueForKey:propertyName] forKey:propertyName];
}
[resultArray addObject:model];
}
}
return resultArray;
}
#pragma mark update
- (BOOL)create: (id)model {
ADCoreDataManager * manager = [NSEntityDescription insertNewObjectForEntityForName:CLASS_NAME(model) inManagedObjectContext:_manageContext];
for (NSString * propertyName in [self ClassAttributes:model]) {
[manager setValue:[model valueForKey:propertyName] forKey:propertyName];
}
BOOL result = [self saveContext];
return result;
}
- (BOOL)remove: (id)model {
NSError * error = nil;
NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:nil] error:&error];
if (listArray.count > 0) {
for (ADCoreDataManager * manager in listArray) {
[_manageContext deleteObject:manager];
}
}
return [self saveContext];
}
- (BOOL)remove: (id)model
predicateString: (NSString *)predicateString {
NSError * error = nil;
NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:predicateString] error:&error];
if (listArray.count > 0) {
for (ADCoreDataManager * manager in listArray) {
[_manageContext deleteObject:manager];
}
}
return [self saveContext];
}
- (BOOL)modify: (id)model
predicateString: (NSString *)predicateString {
NSError * error = nil;
NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:predicateString] error:&error];
if (listArray.count > 0) {
for (ADCoreDataManager * manager in listArray) {
for (NSString * propertyName in [self ClassAttributes:model]) {
[manager setValue:[model valueForKey:propertyName] forKey:propertyName];
}
}
}
return [self saveContext];
}
#pragma mark - collect
- (NSFetchRequest *)bindRequest: (NSString *)className
predicate: (NSString *)predicateString {
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:className inManagedObjectContext:_manageContext]];
if (predicateString != nil) {
NSPredicate * predicate = [NSPredicate predicateWithFormat:predicateString];
NSLog(@"%@", predicate);
NSLog(@"%@", predicateString);
[request setPredicate:predicate];
}
return request;
}
#pragma mark - save
- (BOOL)saveContext {
NSManagedObjectContext * context = [self manageContext];
if (context != nil) {
NSError * error = nil;
if ([context hasChanges] && ![context save:&error]) {
NSLog(@"%@", [error userInfo]);
abort();
return NO;
}
}
return YES;
}
- (NSURL *)applicationDomainUrl {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
#pragma mark - allAttributes
- (NSMutableArray *) ClassAttributes: (id)classModel {
NSMutableArray * array = [NSMutableArray array];
NSString *className = NSStringFromClass([classModel class]);
const char * cClassName = [className UTF8String];
id classM = objc_getClass(cClassName);
unsigned int outCount, i;
objc_property_t * properties = class_copyPropertyList(classM, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSString * attributeName = [NSString stringWithUTF8String:property_getName(property)];
[array addObject:attributeName];
}
return array;
}
@end
在m文件中, 我使用了運行時。 運行時拿到一個模型的屬性 這樣我們可以更加方便的使用KVC
大家仔細看一下這種封裝的過程
2.中間層: ADCoreDataManager.h
// // ADCoreDataManager.h // CoreData_CE // // Created by Dylan on 14-10-11. // Copyright (c) 2014年 Dylan. All rights reserved. // #warning add Model properties Here #import <CoreData/CoreData.h> #import <Foundation/Foundation.h> @interface ADCoreDataManager : NSManagedObject /*! * @Author Dylan. * * e.g */ @property (nonatomic, strong) NSString * name; @end
.m文件
//
// ADCoreDataManager.m
// CoreData_CE
//
// Created by Dylan on 14-10-11.
// Copyright (c) 2014年 Dylan. All rights reserved.
//
#warning don't forget write @synthesize
#import "ADCoreDataManager.h"
@implementation ADCoreDataManager
@synthesize name = _name;
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
}
@end
大家可以把所有模型的屬性 扔到中間層裡邊。 使用中間層去做中介傳值。
使用:
1. 創建自己的momd文件。 新建-》coredata-》model 創建之後添加模型
2. 初始化單例
附上測試代碼
// test
ADCoreData * coreData = [ADCoreData shareInstanceWithStoreName:@"CoreData"];
Dylan * dylan = [[Dylan alloc] initWithEntity:[NSEntityDescription entityForName:@"Dylan" inManagedObjectContext:coreData.manageContext] insertIntoManagedObjectContext:nil];
[dylan setName:@"Dylan"];
NSLog(@"**************************************************");
NSLog(@"first = %@", [coreData findByModel:dylan]);
NSLog(@"**************************************************");
[coreData create:dylan];
NSLog(@"second = %@", [coreData findByModel:dylan]);
NSLog(@"third = %@", [coreData findByModel:dylan predicateString:@"name = 'Dylan'"]);
NSLog(@"**************************************************");
[coreData remove:dylan];
NSLog(@"fourth = %@", [coreData findByModel:dylan]);
NSLog(@"**************************************************");
[coreData create:dylan];
NSLog(@"fifth = %@", [coreData findByModel:dylan]);
NSLog(@"**************************************************");
Dylan * dylan1 = [[Dylan alloc] initWithEntity:[NSEntityDescription entityForName:@"Dylan" inManagedObjectContext:coreData.manageContext] insertIntoManagedObjectContext:nil];
dylan1.name = @"dylan-1";
[coreData modify:dylan1 predicateString:nil];
NSLog(@"sixth = %@", [coreData findByModel:dylan]);
NSLog(@"seventh = %@", [coreData findByModel:dylan1]);
CoreData書寫雖然比較難, 但是操作方便
大家在使用謂詞的時候 要特別的注意 在你的值上邊加單引號 類似: name = 'Dylan' 防止CoreData在操作request請求時候出現錯誤
@Dylan.