关于CoreData的理解和使用.

CoreData是苹果官方推出的一种方便的面向对象的存储方式,相信大家都已经对其有所了解,但是对于CoreData的概念大家都存在部分的误区.给大家推荐个网址是苹果的官方文档的翻译版(http://objccn.io/issue-4-1/)这里详细的解释了CoreData存在以及出现的意义.下面我就带大家来学习下如何使用CoreData.

今天我们先学习最基础的CoreData的操作(单表操作)

第一步 创建一个带有CoreData的工程.

创建完成带有CoreData的工程后我们可以看到我们工程左边列表里有一个名字叫做CoreDataTest.xcdatamodeld的文件在哪里就是我们创建我们Model类实体文件的地方.

然后我们打开我们看到的那个文件,在里面我们创建一个叫做ClassEntity的实体名称.

在我们创建完成那个实体文件以后我们看到我们的中间列表里面有一个添加实体属性的位置.在这里我们添加三条属性.名字分别为name sex age 类型全部选择是string

在属性添加完成后我们就可以去生成对应的实体类文件我们需要先选中CoreDataTest.xcdatamodeld这个文件然后选择菜单栏上的Editor选择Creat NSManagerObject Subclass...

创建完成后我们可以看到两个叫做ClassEntity的文件被创建好了,然后我们再来看下其他不同于以往工程的地方.我们先来打开看下我们的AppDelegate.h文件,我们可以看到在AppDelegate.h文件中和以前我们创建的工程不同的地方.

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

//被管理者对象上下文
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

//数据模型器管理类
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;

//数据连接器工具类 (连接助理)
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

//通过对上下文的保存,将上下文管理的对象保存到实体数据库.
- (void)saveContext;

//获取数据库所在的路径
- (NSURL *)applicationDocumentsDirectory;

@end

看完AppDelegate.h中的不同后我们来看下AppDelegate.m中有什么不同.

#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (NSURL *)applicationDocumentsDirectory {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "com.lanou.LessonCoreData" in the application‘s documents directory.
    NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

- (NSManagedObjectModel *)managedObjectModel {
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }

    //momd 去查询xcdatamodeld
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"LessonCoreData" withExtension:@"momd"];
    //创建数据器模型工具类.
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    // Create the coordinator and store

    //使用数据模型器工具类实例化数据连接器工具类.
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    //数据库的绝对路径.
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"LessonCoreData.sqlite"];
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application‘s saved data.";

    //创建数据库的过程.
    //1.数据持久化类型
    //2.设置信息
    //3.数据库的绝对路径.
    //4.配置SQL数据的选项
    //5.错误信息的赋值.
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // Report any error we got.
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application‘s saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //程序中断
        abort();
    }

    return _persistentStoreCoordinator;
}

- (NSManagedObjectContext *)managedObjectContext {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    //通过GET方法创建数据连接器工具类
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    //判断数据器连接工具类是否为空
    if (!coordinator) {
        return nil;
    }
    //创建数据管理器工具类
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    //设置数据管理器工具类的数据连接器.
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

#pragma mark - Core Data Saving support
//保存你当前的操作到数据库中.
- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = nil;
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

这些就是我们在创建完成一个带有CoreData的工程和以前我们创建的工程的区别.然后我们来看下我们当前应该如何对我们当前创建的数据库来操作.首先进入到我们当前需要用到CoreData的类文件中创建AppDelegate的实例,然后再当前类的- (void)viewWillDidLoad方法中去实现对CoreData的操作.

#import "ViewController.h"
#import "AppDelegate.h"
#import "ClassEntity.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //获取当前的AppDelegate的实例.
    AppDelegate *appdelegate = [UIApplication sharedApplication].delegate;

    ////为数据库中增加数据

    //创建当前实体类的实体描述
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"ClassEntity" inManagedObjectContext:appdelegate.managedObjectContext];

    //通过实体描述文件来创建当前类的实例.
    ClassEntity *classEntity = [[ClassEntity alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:appdelegate.managedObjectContext];

    //为实例的属性赋值.
    classEntity.name = @"张三";
    classEntity.sex = @"男";
    classEntity.age = @"21";

    //保存操作到真实的数据库内.
    [appdelegate saveContext];

    ////查询数据库内存放的实体内容.

    //创建查询语句
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"ClassEntity"];

    //通过AppDelegate来查询你想要的数据库.
    //注意返回值为数组.
    NSArray *arr = [appdelegate.managedObjectContext executeFetchRequest:request error:nil];

    //打印数组
    NSLog(@"%@",arr);

    ////删除数据库中存放的实体.

    //通过查询获取到你需要删除的表单中的所有内容.

    //通过返回值获取到的数组来查找你当前想要的实体位置.
    ClassEntity *classEntity1 = [arr objectAtIndex:0];

    //通过AppDelegate
    [appdelegate.managedObjectContext deleteObject:classEntity1];

    //通过AppDelegate来保存到你的真实数据库中.
    [appdelegate saveContext];

    // Do any additional setup after loading the view, typically from a nib.
}

这些就是本次的CoreData是如何使用的.这次的内容也就到这里结束了.下次会和大家分享多表的CoreData的操作.最后附上我的文件列表截图

.

时间: 2024-10-23 10:57:57

关于CoreData的理解和使用.的相关文章

coreData 深入理解4 --总结 (线程安全与同步--iOS5 前后对比)

分类: Base&Inter&Skill iphone 平台 iphone+平台2014-03-24 15:27 1140人阅读 评论(1) 收藏 举报 目录(?)[+] Core Data是iOS中很重要的一个部分,可以理解为基于SQLite(当然也可以是其他的Storage,如In-memory,只是SQLite比较常见)的一个ORM实现,所以有关系数据库的特性,又不用写SQL.顺便吐一下槽,官方说法是使用Core Data能减少50%-70%的代码量,但相信用过的人应该都心里明白,C

iOS -数据持久化方式-以真实项目讲解

前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎么会使用到这些方式,都会以本人实际开发的场景为例,大约需要花10-15分钟,欢迎大家指正. 一.前言 和大家说一个真实故事,前年我去美图面试(当时的技术仅仅是UI和接口的实现,并不注重很多底层实现和很多概念的原理,换句话说,就是真正的码农),过了技术第一轮和第二轮(前两年的也就是问问技术点的实现),

IOS中CoreData浅析

CoreData简介: 什么是CoreData? Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句 CoreData 不能执行SQL语句 取而代之,操作的是对象.而常用的三方库 FMDB SQLite 可以直接SQL语句 CoreData和数据库有什么区别? CoreData是一个苹果原生的框架,它拥有像数

iOS开发——数据持久化OC篇&amp;(七)CoreData高级常识

CoreData高级常识 关于CoreData貌似实际开发中很少用到,基本上是个有九个公司不会使用它,因为都说是性能不好,但是作为一个程序员,了解及其使用时必须了, 下面是我从一位大神那里搬过来的一下Core详细介绍,相信以后总有一天会帮我解决不少学习CoreData中的问题! 一.技术概览 1. Core Data 功能初窥 对于处理诸如对象生命周期管理.对象图管理等日常任务,Core Data框架提供了广泛且自动化的解决方案.它有以下特性. (注:对象图-Object graph的解释:在面

CoreData之增删改查

1. 导入库文件CoreData.framework2. 在iOS的Core Data 中建Data Model文件 此时有三种选择 2.1. 选Data Model(如默认名Model.xcdatamodeld) 2.11 再点击下边的Add Entity按钮(修改名为Person) 2.12 再在Attributes中添加(成员变量)保存变量信息 2.13 再创建继承自NSManagedObject的模型Person 2.14 再在模型.h文件中创建Attributes中添加的成员变量 2.

CoreData的基本使用

CoreData:是苹果的原生框架, 就理解为管理数据模型用的吧.可以替代SQLite,使用它就再也不需要写什么SQLite语句了.面向对象,更好用! 不管那么多直接来使用吧~~ 第一步,在创建项目的时候,可以勾选coreData.系统会自动生成coreData文件. 第二步,在项目中找到格式为xcdatamodeld的文件 ,添加entity实体,这个实体就是模型,最后可以生成平时使用的模型文件. 设置类名 添加属性 生成文件 第三步:可以去appDelegate中看看一些不一样的东西.苹果自

认识CoreData—使用进阶

之前两篇文章都比较偏理论,文字表达比较多一些,但都是干货!学习时先理解理论知识,才能更好的帮助后面的理解.在这篇文章中,将会涉及关于CoreData的一些复杂操作,这些操作会涉及分页查询.模糊查询.批处理等高级操作.通过这些操作可以更好的使用CoreData,提升CoreData性能.文章中将会出现大量示例代码,通过代码的方式更有助于理解. 文章内容还会比较多,希望各位耐心看完.文章中如有疏漏或错误,还请各位及时提出,谢谢! NSPredicate 概述 在iOS开发过程中,很多需求都需要用到过

SQLite和CoreData数据库的比较

1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. 这些操作都需要使用SQL语句去实现,感觉操作很直接.如果先前有一点数据库和SQL基础的话,写起来会感觉很亲切,都是一些数据库操作的语句.但是当操作变多之后,语句越来越多,就很烦,代码比较多,看起来也会混乱一些. 如果想要详细了解,可以看iOS学习36数据处理之SQLite数据库 2. CoreDa

CoreData学习:Core Data Stack(Swift)

Core Data是苹果官方提供的一套框架,用来解决对象生命周期管理.对象关系图管理和持久化等方面相关的问题.Core Data是模型层的技术,Core Data帮助你构建代表程序状态的模型层.Core Data也是一种持久化技术,它可以将模型的状态持久化到磁盘.但它更重要的特点是:Core Data不只是一个加载和保存数据的框架,它也能处理内存中的数据. 什么是Core Data? 对于Core Data框架将经常困惑,以为是数据库.其实Core Data并不是数据库.如果它不是数据库,那么C