现在根据模型来创建NSManagedObject的子类.如果模型改变了,那就就重新生成这些文件.所以,不要在生成的文件里自定义方法,因为重新生成之后,这些修改就丢失了.假如确实需要重新生成自定义的方法,那么可以从中继承子类,或者是针对生成的文件创建类目.(是分类吧??) 创建NSManagedObject子类的步骤如下: 选中Item实体 点击Editor > Create NSManagedObject Subclass... 确保Model处于勾选状态,然后点击Next按钮 勾选Item实体…
项目创建时会有 “Use Core Data" ,但是,有时没有勾选这个选项,那么就要手动链接Core Data Framework. 选中 Grocery Dude Target General > Linked Frameworks and Libraries > + ,选择CoreDataFramework 1.4.1. Core Data Helper 简介 1.4.2. 实现 Core Data Helper 类…
右键分组Grocery Dude > New Group > Data Model New File > Core Data > 创建新的模板文件…
Core Data是个框架,把数据当作对象来操作. 由Core Data提供的数据对象叫托管对象(managed objecgt),而Core Data 位于程序和持久化存储区之间. 托管对象模型里有对象图(object graph),对象图里有实体(实体类),实体创建托管对象. 托管对象持有一份相关数据的拷贝.可以看作数据库里某张表的某一行. 托管对象可以是NSManagedObject实例,但是一般情况下,它是某个NSManagedObject子类的实例. 所有托管对象都必须位于托管对象上下…
译者序 前言 勘误 1. 初次尝试Core Data应用程序 本书的基础,基本概念,能做什么,不能做什么.实现CoreDataHelper类,演示如何将Core Data同既有的应用程序相集成. 2. 托管对象数据模型的基本知识 传统数据库模式的设计与Core Data 之间的共性,并介绍数据模型.讨论实体(entity)和属性,配置基本的托管对象模型(managed object model).如何选择正确的数据类型.插入.获取.过滤.排序及删除托管对象.获取请求模板. 3. 托管对象数据模型…
创建名为Grocery Dude的Single View程序,并按默认设置处理,不勾选Core Date 和 Git. 设计故事板: 选择Main.Storyboard 拖放一个 Table View Controller 到故事板中 选中新拖入的Table View Controller 勾选 “Is initial View Controller” 选中 Table View Controller 并点击Editor > Embed In > Navigation Controller 拖…
持久化存储协调器(persistent store coordinator)里面包含一份持久化存储区,而存储区里又含有数据表里的若干行数据. 与原子存储不同,SQLite数据库会在用户提交变更日志时进行增量变更,变更日志也叫事务日志. 持久化存储区只应由Core Data 创建,不应该让Core Data 使用不由它创建的数据库.如果需要使用既有的数据,应该将其导入Core Data(第8章). 同一个持久化存储协调器可以有多个持久化存储区.可以把属于iCloud的数据放到一个存储区,不属于iC…
初始化Core Data的三个方法: init,初始化托管对象模型.持久化存储协调器.托管对象上下文 - (id)init { ) { NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd)); } if (self = [super init]) { _model = [NSManagedObjectModel mergedModelFromBundles:nil]; _coordinator = [[NSPer…
有些支持Core Data的内置模板是在应用程序委托里面设置Core Data的.但是为了模块化,我们通过应用程序委托惰性地创建CoreDataHelper类的实例: 初始化托管对象模型 根据托管对象模型创建持久化存储区,并据此初始化持久化存储协调器 根据持久化存储协调器来初始化托管对象上下文 修改程序,创建CoreDataHelper: 创建新组:Generic Core Data Classes 创建名为 CoreDataHelper 的class,继承自NSObject, 加入代码 #im…
持久化存储协调器会试着用新版的模板打开原来的持久化存储区,但是那是旧的模板,旧的格式,当然会出错.现在要做的就是迁移现有的持久化数据区,以便跟新模型匹配. 怎么进行迁移呢? 在什么时候进行迁移? 在向NSPersistentStoreCoordinator添加存储区的时候. 那么如何添加呢? 答案是,将下列选项放到NSDictionary里传过去,就会自动完成存储区的迁移工作. 如果传给NSPersistentStoreCoordinator的NSMigratePersistentStoresA…
为了不像3.1那样崩溃,修改模型之前先创建新的模型版本.添加之后,会生成一个新的xcdatamodel文件,并且跟原来的内容完全一样,这有意思了,但是不要删除原来旧版的模型.旧的模型有助于把原来持久化存储区迁移到当前的模型版本. 修改程序: 选中Model.xcdatamodeld 点击Editor > Add Model Version... 点击Finish,默认将Model 2用作版本名称 如图: 注意,我们要修改新的模板,慢慢进入正题了: 注意备份程序 选择Model 2.xcdatam…
可供配置的选项根据属性类型的不同有所变化,并不是每一种属性都能配置下列选项 Transient:勾选该选项,表示该属性不写入“持久化存储区”,这听起来很奇怪,但有时候,只需要把特性留在托管对象上下文就行了. Opitional:optional特性并不一定要有值.所有特性再刚创建的时候都是optional特性.如果某个特性不是optional特性,那么它在写入存储区的时候必须要具备有效的值才行. Indexed:系统会优化Indexed特性以提高搜索效率,但是缺点是要在存储区占用更多的空间.并且…
单精度浮点数与双精度浮点数:创建NSManagedObject紫雷师,如果实体中单精度或双精度浮点数类型,那么在子类里,相关特性的类型是NSNumber. 小数:涉及货币时,建议设置为小数(decimal),精度高.特性类型为NSDecimalNumber,若要保留精度,只能使用NSDecimalNumber内置的方法. 字符串String:可以存放字符数组(array of character)或普通文本(plain old text).对应特性为NSString. Boolean:对应特性为…
如果应用程序要保存的设置数据太多,以致NSUserDefaults及“属性列表“(property list)这种简单的存储方案无法应付.不需要再"重新发明轮子"(reinventing the wheel),使用Core Data即可.…
托管对象模型是一种数据结构.在这里,数据结构.纲要.对象图.数据模型.托管对象模型这些术语是一个意思.它们是对同一个东西不同场景的描述.比如,对Core Data 而言是托管对象模型,对设计器来说是对象图.…
Core Data通过谓词(NSPredicate)来筛选,比如限定获取的数量等.谓词基本对存储区不敏感,但也有例外,比如:matches可用在 in-memory存储区,但是不能用在SQLite存储区.谓词是SQL里面的where子句. 在筛选的过程中,每个托管对象都会根据谓词求值,根据返回的YES或NO取舍. 具体的谓词规则查阅:developer.apple.com 并搜索Predicate Programming Guide. 程序修改代码如下: NSSortDescriptor *so…
上一节已经插入了数据,非常好.但是,我得更进一步.要知道里面究竟发生了什么,持久化存储区的数据有什么变化,生成了哪些查询语句.每次运行程序时,是否重复插入了对象. 有一个调试选项可以提供足够的信息,开启SQL Debug模式: 点击 Product > Scheme > Edit Scheme 点击 Run Grocery Dude,并切换到Arguments分页 点击 Arguments Passed On Launch 区域的 “+”按钮,以增加参数 输入新参数 -com.apple.Co…
Core Data 使用 “带符号的整数”,通常我们会选择Integer 32,如果不够,可以升级为Integer 64 (第3章),通过升级托管对象模型. 这三种类型对应的特性(Property)类型为NSNumber.…
该程序功能如下: 分类显示家里各个位置的东西,以此提示该购买哪些生活用品 在超市购买时,告诉某个货品摆在哪条过道旁的货架上 将待买物品按过道编组,这样每个过道只需走一遍,就可以拿完所需货品 通过iCloud在各设备间同步数据 1.3.1. 新建Xcode项目并设置故事板 1.3.2. App Icon 与 Launch Image…
到现在为止,还没有创建过托管对象,回顾了一下,只是创建了托管对象模型,持久化存储区,持久化存储协调器,托管对象上下文. 那么,现在就来创建托管对象吧. 使用NSEntityDescription 的 insertNewObjectForEntityForName来创建 - (void)demo{ ) { NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd)); } NSArray *newItemNames =…
第一章的例子配置好了持久化存储区.持久化存储协调器.托管对象上下文.但是还没有对象图,本章要介绍托管对象模型的基础知识,并配置范例程序的对象图. 2.1. 托管对象模型是什么 托管对象模型是一种数据结构. 2.2. 添加托管对象模型 2.3. 实体 2.4. 属性 2.5. Integer 16 .Integer 32.Integer 64 2.6. 单精度浮点数与双精度浮点数 2.7. 属性的各种设置选项 2.8. 创建 NSManagedObject 的子类 2.9. Scalar Prop…
App Icon: 选中 Assets.xcassets 选择 AppIcon ,并拖入图片(29.40.60) Launch Image: 创建 Launch Image 拖入图片(2x.R4)…
管理托管对象的生命周期(lifecycle).还有其它功能:faulting.变更追踪(change tracking).验证(validation)等. faulting:只把用到的那一部分数据从持久区里获取出来(第10章). 变更追踪:用于支持重做及撤销功能. 验证机制:确保由托管对象模型所订立的规则.比方说,可以针对实体的单个属性来限定其最小值或最大值(第2章). 托管对象上下文也可以不止一个.有时我们需要在后台处理任务(比如把数据保存到磁盘或导入数据),这种情况下可以使用多个托管对象上下…
托管对象模型即对象图,可以看成实体类的描述,规定了数据字段. 要想创建托管对象模型,需生成NSManagedObjectModel类的实例.…
持久化存储文件在文件系统中的位置 先获取应用程序文档目录的路径 #pragma mark - PATHS - (NSString *)applicationDocumentsDirectory { ) { NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd)); } return [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUs…
托管对象模型是会变好的,有时候变化的比较小,什么添加验证规则.修改默认值.修改获取请求模板等.但是设置到结构变化,如添加.删除字段时,需要先把持久化数据区迁移到新的模型版本才行.假如没有提供迁移数据所需的映射与设定,那么应用程序就会崩溃. 程序修改,以引发模型不兼容错误 运行程序,确保创建了持久化存储区 选中Model.xcdatamodeld 添加Measurement新实体 添加abc属性,类型为String 重新运行程序,发现错误 reason=The model used to open…
可以不用手动写谓词,用Xcode的Data Model Designer.只是要用到AND .OR等逻辑组合时,还得用代码写谓词. 程序示例操作如下: 选中Model.xcdatamodeld 点击Editor > Add Fetch Request 设置模板名字 点击"+"号来配置 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];…
Entity 实体,就像是数据表的映射类.用实体就可以创建托管对象了. 实体需要做的就是设置实体名称.实体属性及属性数据类型. 还可以根据实体配置NSManagedObject的子类(可选),创建子类的好处是,可以在托管对象后面使用“点符号”(.)访问相关属性,令代码更易阅读. 一个托管对象可以看成数据库中的一行数据. 实体的属性对应托管对象的特性(Property). 添加Entity并更名为Item.…
测试的方法也很简单: 首先,在AppDelegate.h里面引用CoreDataHelper @property (strong, nonatomic, readonly)CoreDateHelper *coreDataHelper; 初始化CoreDataHelper - (CoreDateHelper*)cdh { ) { NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd)); } if (!_coreDa…
现在,要添加一个保存修改的方法.其实很简单,就是调用持久化存储协调器的save方法. - (void)saveContext { ) { NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd)); } if ([_context hasChanges]) { NSError *error; if ([_context save:&error]) { NSLog(@"_context save ch…