CoreData

CoreData 是什么?

  • Core Data 是一个模型层的技术。Core Data 帮助你建立代表程序状态的模型层。Core Data 也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data 不仅是一个加载、保存数据的框架,它还能和内存中的数据很好的共事
  • Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句.

CoreData 基本概念

  • 托管对象(managed object)
    一个托管对象代表你想要保存到数据存储中的一个对象。这在概念上类似于SQL中的一条记录, 并且通常也包含一些域,这些域对应于你想要保存的对象的属性。
  • 数据存储(data store)
    Core Data支持4中类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore。
  • 托管对象上下文(managed object context)
    托管对象上下文类似于应用程序和数据存储之间的一块缓冲区。这块缓冲区包含所有未被写入数据存储的托管对象。你可以添加、删除、更改缓冲区内的托管对象。在很多时候,当你需要读、插入、删除对象时,你将会调用托管对象上下文的方法。
    操作实际内容 作用:插入数据 查询 更新 删除
  • 持久化存储协调器(persistent store coordinator)
    持久化存储协调器处理到数据存储的连接,并且包含一些底层信息,像用到数据存储的名字和位置。这个类通常被托管对象上下文用到。
    NSPersistentStoreCoordinator(持久化存储助理) 相当于数据库的连接器
  • 托管对象模型(managed object model)
    托管对象模型是一个类,这个类包含每一个你想存储到数据存储中的托管对象的定义。
    NSManagedObjectModel(被管理的对象模型)相当于实体,不过它包含 了实体间的关系

这里有我写的一个简单的Dmeo http://pan.baidu.com/s/1o6iO6AA 这里下载提取码 3k2z , 有兴趣的可以自己下载来看..
这个 Demo 主要讲的是 CoreData 的原理上的问题, 利用NSManagedObjectContext来实现增删改查等基本的原来,用起来不够整洁方便, 看起来也过于繁琐! 下面我们来看一个比现在这个看起来相对简单的Demo, 然后流程我也会讲到!

CoreData 的使用

  • 首先我们先创建两个实体 PeopleInfo 和 CarInfo
    PeopleInfo实体中有: name , age , sex 三个属性
    CarInfo实体中有: carName, carAge 两个属性
  • 然后建立 PeopleInfo 和 CarInfo的关联关系
    我这里的关系是一个人可以有很多辆汽车
    PeopleInfo 的属性和关系表

CarInfo 的属性和关系表

  • 接着生成Model类

    Editor->>Create NSManagedObject Subciass..

    这里你们应该只有一个,在没有升级的情况下,那么就选定一个就可以了

    这里可以两个一起生成, 编译如果有错误, 那么就重新生成一次,将原来的覆盖即可;(因为 Xcode 有时候会抽风)
  • 接着写一个ManageData管理的单利类,用来管理NSManagedObjectContext的一些增删改查的操作
    这个单利的作用是对 CoreData 数据库的创建, 数据的增删改查等等一些操作

    对数据的创建, 并且新建一个NSManagedObjectContext,供整个单利来使用

    123456789101112131415
    - (void)setupManaegdObjectContext{    NSURL *paths = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];    NSURL *storeURL = [paths URLByAppendingPathComponent:@"text.sqlite"];    self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];    self.managedObjectContext.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];    NSError *error;    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:                             [NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption,nil];    [self.managedObjectContext.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];    if (error) {        NSLog(@"setupManagedObjectContextError: %@", error);    }    self.managedObjectContext.undoManager = [[NSUndoManager alloc] init];
    
    }
  • 接下来我们对我们要操作的实体类来添加一个Category(类目)
    我们用这个类目来对整个实体类中得数据来进行操作, 比如在这里实体类中添加数据, 改变数据,删除数据等等, 之所以我们在这里用一个类目来扩展这个实体类是因为我们要升级原有的实体类,所以这些操作要在这个类的类目中来进行
    这里我们针对PeopleInfo实体来新建一个类目

    Categray(类目)有什么作用呢
    1.为没有源代码的类添加方法,因为我们拿不到源代码,所以不能添加实例变量但可以添加方法
    2.具体操作:在相应的.h文件里声明,在.m文件里实现 声明和实现与其他普通的类一样
    3.具体格式:在.h文件里 @interface 需要扩展的类名(NSString) (扩展类名)开头 @end结束 在.m文件里以:@implementation 需要扩展的类名(NSString) (扩展类名) @end结束
    4.在main.m文件里的调用和其他方法一样
    延展有什么作用呢
    主要是为有源代码的类添加实例方法或对象 内容私有只在.m文件里实现,不进行声明.
    1.在.m文件里的开头之前添加@interface 类名 (延展类名){添加实例变量和方法}@end结束
    2.在.m文件的实现部分对延展里面的方法进行实现

  • 在PeopleInfo类目中写方添加一条数据的方法并实现
    在.h中写方法
    1
    + (PeopleInfo *)addSomeDataManagedObjectContext:(NSManagedObjectContext *)context WhitName:(NSString *)name WhitSex:(NSString*)sex WhitAge:(NSString *)age;

在.m中实现方法

123456789101112131415161718192021
+ (PeopleInfo *)addSomeDataManagedObjectContext:(NSManagedObjectContext *)context WhitName:(NSString *)name WhitSex:(NSString *)sex WhitAge:(NSString *)age{    PeopleInfo *peo = nil;

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"PeopleInfo"];    request.predicate = [NSPredicate predicateWithFormat:@"age == %@", peo.age];    NSError *error = nil;    NSArray *matches = [context executeFetchRequest:request error:&error];    if (!matches||[matches count] > 1) {    }else{        if (![matches count]) {            peo = [NSEntityDescription insertNewObjectForEntityForName:@"PeopleInfo" inManagedObjectContext:context];        }else{            peo = [matches lastObject];        }        peo.name = name;        peo.age = age;        peo.sex = sex;    }    return peo;}
  • 在单利ManageData中利用NSManagedObjectContext来添数据

    123
    - (void)addDataWhitName:(NSString *)name WhitSex:(NSString*)sex WhitAge:(NSString *)age{    [PeopleInfo addSomeDataManagedObjectContext:self.managedObjectContext WhitName:name WhitSex:sex WhitAge:age];}
  • 最后在ViewController中调用添加数据的方法
    1
    [[ManageData shareInstance] addDataWhitName:self.nameTextField.text WhitSex:self.sexTextField.text WhitAge:self.ageTextField.text];

在这里我只写了添加的一个操作, 剩余的操作请大家下载Demo

CoreData 升级-版本升级

    • 升级分为两种,第一种是简单的升级, 在原来的基础上添加字段属性的.另外一种是比较复杂的操作,修改原来数据表的字段的名字或者属性.

      添加字段属性升级

    • 如果您的APP已经上架,那么我们的CoreData 数据表不能进行操作, 否则就会有各种奇葩的错误, 如果我们想进行数据表的操作首先我们应该在原来的基础上进行升级, 然后再操作, 完成后再把我们的 CoreData 的 Model Version选择到我们已经升级的版本即可;
    • 选择要升级的版本进行升级

    • 升级完成后可以在新的表中添加新的字段什么的都可以,
    • 升级完成, 选择版本
    • 升级完成后再生成 Model 等文件, 和刚才的操作步骤一样

      修改原来字段名字操作

    • 首先也是要升级一个新的版本(同上升级新), 在修改原有字段的名字
    • 升级完成后再生成 Model 等文件, 和刚才的操作步骤一样
时间: 2024-10-20 03:00:23

CoreData的相关文章

coredata 的基本使用(转载)

CoreData提供了一种简便的对象持久化管理方法,使你可以不用关心数据的存储,只需要关心对象的增加.删除.更改.读写. 基本概念托管对象(managed object)一个托管对象代表你想要保存到数据存储中的一个对象.这在概念上类似于SQL中的一条记录, 并且通常也包含一些域,这些域对应于你想要保存的对象的属性. 数据存储(data store)Core Data支持4中类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore. 托管对

Playground 你不知道的小技巧, CoreData 的使用

Playground 的出现无疑是大大的提高了开发效率,可以节省大量的编译时间. 这里介绍在 Playground 中使用 CoreData 的小技巧. 我们新建一个工程 iOS 项目工程. 点击 File -> New -> File , 在工程中新建文件 Data Model 文件  在 model 中添加一个 Entitle,如下图  编译工程后,在 Product 选择生成的 .app 文件,找到该目录,如下图  查看包中的文件,如图  可以看到一个 Mode.momd 文件, 如图 

IOS中CoreData浅析

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

CoreData数据库

CoreData与Sqlite的比较 Sqlite:1.基于C接口,需要使用sql语句,代码繁琐 2.在处理大量数据时,表关系更直观 3.在OC中不是可视化的 CoreData:1.可视化,有undo/redo能力 2.可以实现多种文件格式NSSQLiteStoreType.NSBinaryStoreType.NSInMemoryStoreType,NSXMLStoreType 3.苹果官方API支持,与iOS结合更紧密 CoreData核心类关系: NSManagedObjectContext

CoreData __ 基本原理

操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context          CoreData和sqlite的区别 CoreData是一个框架;sqlite是苹果使用别人开发好的一个动态库,本质是关系型数据库. CoreData是IOS平台下的一个数据持久化的方式;sqlite可以跨平台使用. 实现思路 首先找到CoreData文件夹 创建Person类,并且建立name属性 C

coredata xmpp

CoreData数据库   好处: 1.表可视化  2.使用简单 3.可以与谓词搭配使用     缺点: 1.不适合处理数据结构   比较复杂的数据 数据结构和算法 NSURLSession Editor ->  Add Model Version  在CoreData添加新模型版本 XMPP                cacoapods 与git  之前都是短链接 http     websevice soap  推送, 要经过 服务器—>  Apns   -> app  长链接:

iOS:CoreData数据库的使用四(数据库和UITableViewController以及NSFetchedResultsController一起使用)

CoreData数据库虽然可以和tableview或者UITableViewController一起使用将数据显示在表格上,但是在准备数据的时候,这种方式需要用一个可变数组来装从数据库一次性取出来的所有数据,然后通过操作这个数组来显示数据再表格上,从内存的优化和性能上来说并不是很好:这里,介绍一种新的抓取数据的方式,苹果公司为了进一步优化内存,创建了一个从数据库抓取数据的控制器NSFetchedResultsController,它能从CoreData中一批一批的抓取数据并存放起来,然后通过操作

iOS:CoreData数据库的使用三(数据库和tableView表格一起使用)

CoreData数据库是用来持久性存储数据的,那么,我们再从该数据库中取出数据干什么呢?明显的是为了对数据做操作,这个过程中可以将它们直观的显示出来,即通过表格的形式显示出来.CoreData配合tableView一起使用,是很常用的一种方式,直观.清晰明了. 下面就来具体的举个例子: 要求:将数据库中的数据显示在表格中,并且可以进行删除.插入等一些操作. 前期的具体步骤: 1.创建项目时,勾选Use Core Data,生成CoreData_____.xcdatamodel文件: 2.点击Co

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

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