IOS---CoreData详解

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");


}
看下能否和你预期的一样,如果数据处理没什么问题了那就更好的关注其他业务逻辑的处理了



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS CoreData 一本好书,smartrookie ■ Chapter 1: Getting Started .................................................................................................................... 1 ■ Chapter 2: Understanding Core Data .................................................................................................. 27 ■ Chapter 3: Storing Data: SQLite and Other Options ............................................................................ 57 ■ Chapter 4: Creating a Data Model..................................................................................................... 107 ■ Chapter 5: Working with Data Objects ............................................................................................. 129 ■ Chapter 6: Refining Result Sets........................................................................................................181 ■ Chapter 7: Tuning Performance and Memory Usage........................................................................203 ■ Chapter 8: Versioning and Migrating Data ....................................................................................... 251 ■ Chapter 9: Using Core Data in Advanced Applications.....................................................................283 ■ Index:................................................................................................................................................359 Contents ■ About the Authors............................................................................................................................... xii ■ About the Technical Reviewer ........................................................................................................... xiii ■ Acknowledgments ............................................................................................................................. xiv ■ Introduction ..........................................................................................................................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值