通读我的应用程序的核心数据文件(.sqlite、.sqlite-wal)

Posted

技术标签:

【中文标题】通读我的应用程序的核心数据文件(.sqlite、.sqlite-wal)【英文标题】:Read through my app's Core Data files (.sqlite, .sqlite-wal) 【发布时间】:2015-04-13 06:11:10 【问题描述】:

我正在尝试在我正在开发的 ios 应用程序中浏览 Core Data 编写的数据。

应用运行一段时间后,我假设收集了一些数据,我现在希望查看数据并查看写入的内容。

我尝试通过从设备获取应用程序容器来获取和浏览.sqlite 文件(Xcode > Devices > myApp > Download Container...)。

我得到了 db 文件,myAppDB.sqlitemyAppDB.sqlite-shmmyAppDB.sqlite-wal

当尝试查看它们时,.sqlite 似乎是一个空表(除了一些通用的 CoreData/sqlite 东西),而-wal 文件包含所有信息。

问题是我只知道wal 在使用 TextEdit 打开它时有有用的数据,它无法以非常易读的方式显示它,当我尝试使用 SQLite Manager 应用程序时,我提示 wal 已加密,并要求我输入密码...

重要的是,我正在编写一个处理数据库的框架(模型文件和用于写入数据的代码在框架内),然后我让这个框架在我正在开发的应用程序中运行。这是我用来在框架内创建商店的代码(使用MagicalRecord):

NSBundle *frameworkBundle = [NSBundle bundleForClass:[self class]];
[MagicalRecord setDefaultModelNamed:@"myAppStore.momd" inBundle:frameworkBundle];

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myAppStoreDB.sqlite"];
[MagicalRecord setupCoreDataStackWithStoreAtURL:storeURL];

更新:我设法用Core-Data-Editor 和CoreDataUtility 打开了sqlite 文件,但它们都覆盖并删除了.wal 文件的内容,并显示了一个空表...它确实有模型(实体名称/属性等)但没有数据。

我的wal 文件为 873KB,但是当我使用这两种工具之一打开sqlite 时,它变成了 0Bytes...

tl;dr

如何浏览我正在开发的应用的 Core Data 编写的信息?

【问题讨论】:

我相信它是由你加密和签名的,以防止部署时出现隐私问题。 @Schemetrical 是的,我假设是这样,但鉴于我从未明确签署/加密它,它是通过一些我无法弄清楚如何解密的默认配置完成的......并且这是我需要帮助的地方... 两个文件都没有加密。只要您没有断开.sqlite 文件和-wal 文件之间的连接,如果您使用SQLite 管理器打开.sqlite 文件(即使没有checkpoint),所有数据都应该可见。跨度> 当我打开 sqlite 文件时,wal 正在被删除,请参阅我的问题中的 UPDATE。 “没有断开连接”是什么意思? 个人对于 SQLite 我使用Base - SQLite Editor。 【参考方案1】:

好吧,由于某种原因,我不得不强制在我的商店中不使用 WAL(使用 @"journal_mode":@"DELETE" 解释 here)。

然后我只得到了.sqlite 文件,没有smhwal 文件,并且能够使用提到的2 个工具(Core-Data-Editor 和CoreDataUtility)打开它并查看数据。

我的猜测是,这与我从框架处理 CoreData(创建 moc、创建实体、保存等)而不是从应用程序处理这一事实有关。另一个猜测是,这与我使用MagicalRecord这一事实有关。

任何有关原因的见解将不胜感激...

【讨论】:

使用 MagicalRecord,如果我调用其中一种方法将数据保存到磁盘,例如MR_saveToPersistentStoreWithCompletion,那么数据将从 WAL 刷新到实际的 sqlite 文件。有关预写日志文件的更多信息,请参阅sqlite.org/fileformat2.html

以上是关于通读我的应用程序的核心数据文件(.sqlite、.sqlite-wal)的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 SQLite 文件无数据

如何在 sqlite 核心数据文件之间正确切换?

更改核心数据堆栈后使用核心数据创建 SQLite 文件后未更新

核心数据不直接保存到 sqlite

如何为基于文档的核心数据应用程序的保存对话框预设文件格式到 sqlite?

如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1