通读我的应用程序的核心数据文件(.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.sqlite
、myAppDB.sqlite-shm
和 myAppDB.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
文件,没有smh
和wal
文件,并且能够使用提到的2 个工具(Core-Data-Editor 和CoreDataUtility)打开它并查看数据。
我的猜测是,这与我从框架处理 CoreData(创建 moc
、创建实体、保存等)而不是从应用程序处理这一事实有关。另一个猜测是,这与我使用MagicalRecord这一事实有关。
任何有关原因的见解将不胜感激...
【讨论】:
使用 MagicalRecord,如果我调用其中一种方法将数据保存到磁盘,例如MR_saveToPersistentStoreWithCompletion
,那么数据将从 WAL 刷新到实际的 sqlite 文件。有关预写日志文件的更多信息,请参阅sqlite.org/fileformat2.html以上是关于通读我的应用程序的核心数据文件(.sqlite、.sqlite-wal)的主要内容,如果未能解决你的问题,请参考以下文章
更改核心数据堆栈后使用核心数据创建 SQLite 文件后未更新