CoreData的使用

之前看关于CoreData的使用都w是很早之前的,对于现在有些不太适用,在网上各种查找和总结之后,写了这篇文章,有兴趣的朋友可以看看。

1.创建工程的时候选择CoreData(不建议)

CoreData

创建工程的是选择了CoreData,创建完工程之后,系统会自动生成该文件



你也可以通过添加文件达到同样的效果



选中文件,往里面添加你想要添加的模型,并对属性进行设置
(ps:Entity首字母必须大写,属性类型也需要规范设置)

创建实体模型



每个模型对应四个文件

2.创建你的Manager类-继承自NSObject

.h文件
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface MyCoreManager : NSObject

/**管理对象, 上下文, 持久性存储模型对象*/
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

/**单例*/
+ (instancetype)shareInstanceWithStoreName:(NSString *)storeName;

/** 查找 数据*/
- (NSMutableArray *)findByModel:(id)model predicateString: (NSString *)predicateString;

/** 插入 数据 */
- (BOOL)insertModel:(id)model;

/** 删除 数据 */
- (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString;

/** 修改 数据 */
- (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString;
@end

.m文件
#import "MyCoreManager.h"
#import <CoreData/CoreData.h>
#import <objc/runtime.h>

#define Class_NAME(CName) NSStringFromClass([CName class])

@interface MyCoreManager ()
/**被管理的数据模型, 数据结构*/
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;

/**连接数据库的*/
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;

/**数据库名*/
@property (nonatomic, strong) NSString *storeName;

@end
static MyCoreManager *coreData;

@implementation MyCoreManager

- (NSManagedObjectContext *)managedObjectContext
{
    if (!_managedObjectContext) {
        
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        
        if (coordinator) {
            _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }
    }
    return _managedObjectContext;
}


//  managedObjectModel 懒加载
- (NSManagedObjectModel *)managedObjectModel
{
    if (!_managedObjectModel) {
        
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:_storeName withExtension:@"momd"];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    }
    return _managedObjectModel;
}


//  persistentStoreCoordinator 懒加载
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (!_persistentStoreCoordinator) {
        
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", _storeName]];
        NSLog(@"---\nstoreURL: %@",storeURL);
        NSError *error = nil;
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            abort();
        }
    }
    return _persistentStoreCoordinator;
}


// Returns the URL to the application's Documents directory.获取Documents路径
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}


#pragma mark - Methods

//  查
- (NSArray *)findByModel:(id)model predicateString: (NSString *)predicateString
{
    NSError *error = nil;
    NSArray *listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
    
    NSMutableArray *resultArray = [[NSMutableArray alloc] initWithArray:listArray];;
    //
    //    if (listArray.count >= 1)
    //    {
    //
    //        for (NSManagedObject *manager in listArray)
    //        {
    //
    //            for (NSString *propertyName in [self ClassAttributes:model] )
    //            {
    //                [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
    //            }
    //            [resultArray addObject:model];
    //        }
    //    }
    return resultArray;
}


//  插入 数据
- (BOOL)insertModel:(id)model
{
    NSManagedObject *manager = [NSEntityDescription insertNewObjectForEntityForName:Class_NAME(model) inManagedObjectContext:_managedObjectContext];
    
    for (NSString *propertyName in [self ClassAttributes:model]) {
        [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
    }
    
    BOOL result = [self saveContext];
    return result;
    
    
}


//  删除 数据
- (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString
{
    NSError * error = nil;
    NSArray * listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
    
    if (listArray.count > 0) {
        for (NSManagedObject *manager in listArray) {
            
            [_managedObjectContext deleteObject:manager];
        }
    }
    return [self saveContext];
}


//  改
- (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString
{
    NSError * error = nil;
    NSArray * listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
    
    if (listArray.count > 0) {
        
        for (NSManagedObject * manager in listArray) {
            for (NSString * propertyName in [self ClassAttributes:model]) {
                [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
            }
        }
    }
    return [self saveContext];
}


//  读取数据请求 ( 连接 请求 )
- (NSFetchRequest *)fetchRequest:(NSString *)entityName predicate:(NSString *)predicateString
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:_managedObjectContext]];
    
    if (predicateString != nil) {
        
        NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
        
        [request setPredicate:predicate];
    }
    return request;
}


#pragma mark - allAttributes
- (NSMutableArray *)ClassAttributes:(id)classModel
{
    NSMutableArray *array = [NSMutableArray array];
    NSString *className = Class_NAME(classModel);
    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;
}


#pragma mark - save
- (BOOL)saveContext
{
    NSManagedObjectContext *context = [self managedObjectContext];
    
    if (context) {
        
        NSError *error = nil;
        if ([context hasChanges] && ![context save:&error]) {
            abort();
            return NO;
        }
    }
    return YES;
}

//  单例
+ (instancetype)shareInstanceWithStoreName:(NSString *)storeName
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        coreData = [[self alloc] init];
        coreData.storeName = storeName;
    });
    return coreData;
}


@end

3.调用

1.引入模型文件,和你创建的模型名字相同的那个
2.引入你的管理类

增
    MyCoreManager * coreData = [MyCoreManager shareInstanceWithStoreName:@"MyData"];
    Student * stu = [[Student alloc]initWithEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:coreData.managedObjectContext] insertIntoManagedObjectContext:nil];
    stu.name = @"alex";
    stu.age = @"12";
    [coreData insertModel:stu];
查
    MyCoreManager * coreData = [MyCoreManager shareInstanceWithStoreName:@"MyData"];
    Student * stu = [[Student alloc]initWithEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:coreData.managedObjectContext] insertIntoManagedObjectContext:nil];
    
    NSMutableArray * StuArr = [coreData findByModel:stu predicateString:@"name = 12 AND age = 12"];
    
    for (Student * stuModel in StuArr) {
        MyModel * model = [[MyModel alloc]init];
        model.name = stuModel.name;
        model.age = stuModel.age;
        [_datas addObject: model];
    }

//删
- (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString
//改
- (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString

三点要注意:
(1) shareInstanceWithStoreName:@"MyData"]中的MyData是你所创建的model文件名
(2) 对象初始化不能简单的alloc init ,需要按上面代码的歌声进行初始化,否则调用对象就会导致程序崩溃
(3)谓词(predicateString)的使用,不懂的同学可以戳这里http://www.jianshu.com/p/3da75e023b9c

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

推荐阅读更多精彩内容