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

简介:

本节书摘来自华章出版社《Core Data应用开发实践指南》一书中的第2章,第2.12节,作者 (美)Tim Roadley,更多章节内容可以访问云栖社区“华章计算机”公众号查看

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显示了其中一部分输出信息。

image

在图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。

image

除了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这一行之上:
    image
  2. 在CoreDataHelper.m文件的loadStore方法中找到调用的addPersist-entStoreWithType那行语句,把其中的options:nil换成options:options。
  3. 再次运行应用程序,然后-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演示了持久化存储区中的托管对象所具备的各种特性值。
image

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

  1. 修改AppDelegate.m文件的demo方法,把NSLog以外的所有代码都删掉。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
24天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
11天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
38 3
|
4月前
|
SQL Java 关系型数据库
spring data elasticsearch 打印sql(DSL)语句
spring data elasticsearch 打印sql(DSL)语句
162 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP.NET Core+Element+SQL Server开发校园图书管理系统(二)
ASP.NET Core+Element+SQL Server开发校园图书管理系统(二)
52 0
|
6月前
|
前端开发 JavaScript
.net core 前端传递参数有值 后端接收到的数据却是null
1、问题分析 在做接口测试时,偶然出现了前端输出有值,但是后端断点调试时却出现接收参数总是为null的情况 2、解决办法 前端打印log,看前端的每一个传值的数据类型,与后端请求参数类进行认真的一一比对 小技巧: ① 直接打印调用接口的传参值的数据类型,例如 console.log(type of this.form.name) --string console.log(type of this.form.age) --number 打印的数据类型与后端接口的参数类比对,查出不对应的类型 ② 关于非必填的值,默认传值可能出现空字符串(' ')、NaN值(Not a Number
105 0
|
9月前
|
SQL 开发框架 前端开发
ASP.NET Core+Element+SQL Server开发校园图书管理系统(完)
ASP.NET Core+Element+SQL Server开发校园图书管理系统(完)
95 0
|
9月前
|
开发框架 JavaScript .NET
ASP.NET Core+Element+SQL Server开发校园图书管理系统(四)(下)
ASP.NET Core+Element+SQL Server开发校园图书管理系统(四)(下)
70 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP.NET Core+Element+SQL Server开发校园图书管理系统(四)(上)
ASP.NET Core+Element+SQL Server开发校园图书管理系统(四)(上)
74 0
|
9月前
|
开发框架 JavaScript .NET
ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)(下)
ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)(下)
53 0
ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)(下)
|
11月前
|
SQL JSON 分布式计算
Spark SQL实战(07)-Data Sources
Spark SQL通过DataFrame接口支持对多种数据源进行操作。 DataFrame可使用关系型变换进行操作,也可用于创建临时视图。将DataFrame注册为临时视图可以让你对其数据运行SQL查询。
145 0