首先,我没有使用 Core Data,我只使用 SQLite。
我将数据保存在表中,然后通过打开应用程序并使用 SQLiteStudio 查看数据来查询它们。我什至创建了一个 LOG 来检查数据是否已保存,是的,它已保存。但是当我停止并再次运行模拟器进行咨询时,没有更多的数据!
Xcode 每次都会覆盖数据库吗?还是发生了超出我有限知识范围的其他事情?
首先,我没有使用 Core Data,我只使用 SQLite。
我将数据保存在表中,然后通过打开应用程序并使用 SQLiteStudio 查看数据来查询它们。我什至创建了一个 LOG 来检查数据是否已保存,是的,它已保存。但是当我停止并再次运行模拟器进行咨询时,没有更多的数据!
Xcode 每次都会覆盖数据库吗?还是发生了超出我有限知识范围的其他事情?
在不了解您的应用程序如何设置、如何配置应用程序以构建或它如何在相关 SQLite DB 文件上运行的更多信息的情况下,我只能提供一些您可以查看的内容的指针您的代码和构建配置可能是您的幻像删除的来源。当然,如果您有其他信息要提供,我很乐意编辑我的答案!
案例 1:“创建数据库”总是在运行?
可能会让您的应用程序出错的一件事是导致决定创建新的 SQLite DB 文件或查看/打开现有文件的决定。如果创建空数据库的代码始终在运行,那么每次您的应用启动时,您的旧数据库文件都会被空白数据库覆盖。
案例 2:使用 'starter' 或 'template' 空数据库?
有时开发人员可能会提供一个空白数据库,其中包含初始数据库模式(通用表和结构)以及一些默认或示例数据。如果您的应用程序这样做,那么导致决定应用该默认数据库的逻辑可能总是被意外触发?如果是这样,使用 NSUserDefaults 来记录指示数据库已成功创建的布尔值可能是跳过“加载我的入门数据库”代码的途径。或者,您可以检查您的数据库文件是否存在,或者查看特定表的内容是否与模板数据不同等。
案例 3:“构建并运行”与“不构建运行”之间的不同行为
在 Product > Perform Action 菜单中有一个不太为人所知的选项,标签为“Run without Building”,它实质上将使用您刚刚在模拟器或设备上运行的应用程序版本启动另一个调试会话。当您使用此选项时,您是否看到数据库有任何不同的行为,或者它仍然是空白的?
案例 4:在 Xcode 调试会话之外直接在模拟器中运行时的不同行为?
“运行”操作的一部分是构建阶段,即使您的应用自上次执行以来没有更改(正如您在问题中所建议的那样),它也可能触发“复制资源”阶段。如果您提供的是库存“默认”或“模板”数据库文件,并且您的应用程序只是在第一次执行应用程序期间打开和编辑该“模板”,那么 Xcode 可能会在随后的“运行”中将其替换为干净的副本' 发生“复制资源”的操作。测试此途径的一种方法:
最后,请确保您遵循 Apple 关于在何处存储用户数据的指导,如果您无意中将某些内容存储在不正确的文件路径中通常不会导致数据空白,则可能会禁止写入数据,这可能被解释为您的数据被覆盖,特别是如果您在它仍然驻留在内存进程中时对其进行询问。表 1-1 中有一些关于文件路径的非常有用的指导:(http://developer.apple.com/library/ios/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUIide/FileSystemOverview/FileSystemOverview.html)
在 Mac 的硬盘上找到您的模拟器应用程序
为了彻底(您可能已经知道这一点!),iOS Simulator 应用程序存储在您的 Mac 硬盘驱动器上,就像您机器上的其他文件一样。他们的组织模仿了物理 iOS 设备。要访问您的应用程序及其数据: