《Core Data应用开发实践指南》一2.12 后端SQL的可见性

2.12 后端SQL的可见性

如果只在控制台的日志中查看Core Data所输出的结果,那么意义并不算太大。你知不知道这些事情背后究竟发生了什么?Core Data对持久化存储区中的数据到底进行了哪些操作?这些操作是否恰当?为了提供无缝的Core Data体验,系统都生成了哪些SQL查询语句?每次在模拟器中运行程序的时候,是不是会插入重复的对象?
有个极其详尽的调试选项可以提供足够的信息,告诉你这些操作背后所发生的事情,从而令你知道上述那些问题的答案。这个调试选项会把系统自动生成的SQL查询语句打印出来,使开发者深刻认识到Core Data的工作原理。
请按下列步骤修改Grocery Dude,以便开启SQL Debug模式:
1. 点击Product>Scheme>Edit Scheme...菜单项。
2. 点击Run Grocery Dude,并切换到Arguments分页。
3. 点击Arguments Passed On Launch区域中的“+”按钮,以新增参数。
4. 输入新参数-com.apple.CoreData.SQLDebug 3,然后点击OK按钮。
现在我们已经开启了第三级(level 3)的SQL Debug模式,然后重新运行应用程序。按下手机的home键(如果是在模拟器中运行,那就按“Shift++H”组合键或点击Hardware>Home菜单项),并观察控制台中的日志。你会看到,系统自动生成了一些INSERT语句,开发者无须手工编写这些语句。图2-7显示了其中一部分输出信息。

在图2-7中,SQLite bind[0]至SQLite bind[7]等变量都是用来拼合INSERT语句的,而这种INSERT语句的用途则是把托管对象的特性值插入到ZITEM表的行中,这张表位于持久化存储区里。ZITEM表是同Item实体相关联的。通过名称可以看出实体的属性与数据库中的field(字段)是怎样对应起来的。Core Data使用前缀字母“Z”作为其标准的命名约定。
为了验证保存在SQLite持久化存储区里的托管对象,你可能需要借助第三方工具来查看其内容。请注意:笔者并不建议直接修改数据库。图2-8演示了如何寻找包含Grocery-Dude.sqlite文件的iOS 仿真器工作目录。由于Library目录是隐藏的,所以需要右击Finder,选择Go to Folder菜单项,然后手工输入目录名。具体的目录位置是:/Users/Username/Library/Application Support/iPhone Simulator/,当然了,你需要把其中的Username部分替换为自己的用户名。Applications目录下面的子目录名称可能会和书中有所不同,因为这是个随机生成的GUID。

除了Grocery-Dude.sqlite文件以外,在同一目录下还有两个分别以-wal及
-shm结尾的文件。iOS 7默认会采用一种新的“数据库日志记录模式”(database journaling mode),而这两个文件正是由这种记录模式所生成的。第8章将会详细讨论这一模式。对于目前来说,为了查看Grocery-Dude.sqlite的内容,我们必须先禁用这种模式。要想禁用iOS 7默认的日志记录模式,就必须在添加持久化存储区的时候传入一种新的选项。
请按下列步骤修改Grocery Dude,以便禁用iOS 7默认的日志记录模式:
1. 修改CoreDataHelper.m文件的loadStore方法,把下面这行代码添加到NSError*error = nil这一行之上:

  1. 在CoreDataHelper.m文件的loadStore方法中找到调用的addPersist-entStoreWithType那行语句,把其中的options:nil换成options:options。
  2. 再次运行应用程序,然后-wal文件应该就会消失了,这表明所有数据都已存放到Grocery-Dude.sqlite文件里面了。可将-shm文件删除,也可忽略该文件。
    通过Google可以搜到很多能够打开SQLite数据库文件的数据库浏览工具。在Sourceforge网站上有一款好工具,名字叫做SQLite Database Browser,笔者建议你现在就把它下载下来,并安装在电脑上试试看。由于该程序未经签名认证,所以需要在System Preferences>Security & Privacy>General中开启Allow applications downloaded from Anywhere选项,然后才能使用。如果不想为了使用该程序而开启这个选项,那么可以在Mac App Store中搜索extension:sqlite,这也是一款能够打开.sqlite文件的程序,而且它通过了Mac App Store的认证。
    虽说查看数据库的内容对程序调试工作很有帮助,但是对于这种由Core Data所管理的数据库来说,不应该在编写代码时依赖它内部的私有模式,因为苹果公司可能会在不通知开发者的前提下自行改变其结构。
    由于Library文件夹是隐藏的,所以若想查看Grocery-Dude.sqlite文件的内容,方便一些的办法是:直接在这个文件上面点击鼠标右键,选择Open With菜单,然后指定用SQLite Database Browser来打开它。请注意,在Xcode中正在运行Grocery Dude程序的时候,不要用数据库浏览工具打开SQLite文件,否则应用程序在尝试打开数据库时会超时。
    图2-9演示了持久化存储区中的托管对象所具备的各种特性值。

假如发现了重复的条目,那就说明上下文保存了不止一次。目前来看,只有当用户按下手机的home键时,程序才会保存上下文。而程序每次启动的时候,demo方法都会插入新对象,于是就产生了重复。但现在不用担心此问题,因为稍后我们就会讲解如何删除托管对象。
请按下列步骤修改Grocery Dude,以免再产生重复的数据:
1. 修改AppDelegate.m文件的demo方法,把NSLog以外的所有代码都删掉。

时间: 2024-08-30 08:58:20

《Core Data应用开发实践指南》一2.12 后端SQL的可见性的相关文章

《Core Data应用开发实践指南》一3.5 通过迁移管理器来迁移数据

3.5 通过迁移管理器来迁移数据 除了通过NSPersistentStoreCoordinator来迁移存储区之外,还可以采用迁移管理器来做.迁移管理器可以使开发者全权掌控迁移过程中创建的文件,从而令他们能够按自己的方式来灵活处理迁移中的各种问题.使用迁移管理器的一个好处就是可以向用户报告迁移进度,使用户知道应用程序哪次会启动得比较慢一些,所以需要耐心等待.虽说迁移过程理应执行得非常快才对,但当数据库比较大.变动比较复杂时,迁移过程就需要耗费一定的时间了.为了使用户界面保持流畅,迁移过程必须在后

《Core Data应用开发实践指南》一1.2 Core Data的适用场合

1.2 Core Data的适用场合 如果应用程序要保存的设置数据太多,以致NSUserDefaults及"特性列表"(property list)这种简单的存储方案无法应付,那么就会出现内存占用量方面的问题.解决办法是直接使用数据库或通过Core Data来间接操作数据库.选用Core Data的好处是,不用再花时间编写数据库接口的代码了.此外,你还将享受性能方面的优势,而且可以使用诸如撤销及验证等强大的功能.假如选择直接使用数据库,那就要花时间去做开发与测试工作,也就是通常所说的&

《Core Data应用开发实践指南》一3.1 修改托管对象模型

3.1 修改托管对象模型 在应用程序的进化过程中,其托管对象模型也可能需要改变.对于一些比较简单的修改,诸如设定属性的默认值.设定验证规则.使用获取请求模板等,是可以直接实施的.而对于另外一些更为结构化的(structural)修改,则需先把持久化存储区迁移到新的模型版本才行.假如没有提供迁移数据所需的映射与设定,那么应用程序就会崩溃.为了继续构建范例程序,需要把上一章中的代码添加到Grocery Dude项目中.或者可以去http://www.timroadley.com/LearningCo

《Core Data应用开发实践指南》一2.2 添加托管对象模型

2.2 添加托管对象模型 在第1章中,我们通过CoreDataHelper.m文件里的mergedModelFromBundles方法初始化了托管对象模型.然而现在的问题是:项目里根本就没有模型可用!如果连模型都没有的话,那Core Data就彻底失去意义了,所以,我们这个时候应该创建模型文件.模型文件一般会含有"对象图",而对象图则用来表示应用程序的数据结构以及其他一些可以简化应用程序开发的东西,我们稍后再来解释.请按下列步骤修改Grocery Dude,以便添加数据模型文件: 在现

《Core Data应用开发实践指南》一第1章 初次尝试Core Data应用程序

第1章 初次尝试Core Data应用程序 如果不能把一件事用简单的话说清楚,那就表明你理解得还不够透彻.-阿尔伯特•爱因斯坦"体验式学习"(kinesthetic learning)或者说"从实践中学习"(learning by doing),是接收并记住信息的绝佳手段.即便对于许多有经验的程序员来说,Core Data也是个相当棘手的话题,于是,笔者就适时地编写了你手中的这本书,它以实践的方式来讲解Core Data.本书不会过早地讲解一些比较难懂的话题,本章只

《Core Data应用开发实践指南》一1.3 创建Grocery Dude项目

1.3 创建Grocery Dude项目 Grocery Dude是个运行在iPhone上的范例程序,在学习本书的过程中,你将了解到它的制作流程.学会了Core Data中的某个特性或某项开发技巧之后,你可以将其运用在Grocery Dude程序上面.到了本书收尾的时候,你将会制作好一款功能完备而且运行速度很快的Code Data程序,它能够同iCloud紧密地集成在一起.假如你现在就想直接看看成品,那可以去App Store下载Grocery Dude.请注意,Grocery Dude是专门为

《Core Data应用开发实践指南》一3.3 轻量级的迁移方式

3.3 轻量级的迁移方式 把新模型设为当前版本之后,必须迁移现有的持久化存储区,只有这样,才能正常使用新模型.这是因为,持久化存储区协调器会试着用新版的模型来打开原有的存储区,但由于原有的存储区是用旧版模型创建的,所以该操作会失败.在向NSPersis-tentStoreCoordinator添加存储区的时候,只需将下列选项放在NSDictionary里传过去,即可自动完成存储区的迁移工作:如果传给NSPersistentStoreCoordinator的NSMigratePersistentS

《Core Data应用开发实践指南》一1.4 为现有的应用程序添加Core Data支持

1.4 为现有的应用程序添加Core Data支持 在Xcode中创建iOS应用程序项目时,可以使用各种起始模板(starting-point template).假如要根据Master-Detail.Utility Application或Empty Application等模板来创建项目,那么只需勾选Use Core Data,即可在项目中使用Core Data.不过,Grocery Dude项目是根据Single View Application模板创建的,它起初并没有包含Core Dat

《Core Data应用开发实践指南》一2.13 获取托管对象

2.13 获取托管对象 想操作托管对象上下文中的现有数据,就必须先把它获取(fetch)过来.假如待获取的数据没有放在上下文里,那么Core Data会从底层的持久化存储区里把它拿出来,这个过程对开发者来说是透明的.要执行获取操作,就得有NSFetchRequest实例,该实例会返回NSArray,这个数组里面的元素都是托管对象.在执行获取操作的时候,NSFetchRequest会根据特定的实体,把每个托管对象都放在NSArray这个数组中,并将其返回给调用者.用SQL数据库领域的术语来说,获取