IOS---CoreData详解
发布日期:2021-11-21 04:41:03 浏览次数:35 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IOS---访问通讯录
下一篇:IOS----plist和date类型的冲突

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月05日 06时29分52秒