神奇的记录 - 上下文(不保存)
Posted
技术标签:
【中文标题】神奇的记录 - 上下文(不保存)【英文标题】:Magical Record - context (not saving) 【发布时间】:2014-07-25 10:35:50 【问题描述】:我完全不确定是什么问题。我正在创建一个新对象并将其插入到上下文中:
Object *object = [Object MR_createEntity];
object.name = @"blahblah";
NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
[context MR_saveToPersistentStoreAndWait];
根据docs,我不应该使用+ MR_contextForCurrentThread
,所以我不这样做:
特别是,不要在任何 +[MagicalRecord saveWithBlock:…] 方法中使用 +MR_contextForCurrentThread — 返回的上下文可能不正确!
但是,如果我打开我的应用数据,我可以看到 3 个文件 (1)appname.sqlite
、(2)appname.sqlite-shm
和 (3)appname.sqlite-wal
。据我所知 2&3 只是缓存。当我打开带有 2 和 3 的文件 1 时,我可以看到我的所有数据。但是,当我只打开文件 1(复制到远离 2&3 的某个地方)时,我的数据库中没有数据,所以我认为有些东西不能正常工作。
该问题仅在设备上可见,而在模拟器上不可见,并且仅当您将 .sqlite 从应用数据复制到您的计算机时。如果您复制所有 3 个文件,您可以看到所有记录,但它表明所有内容都保存在缓存中而不是 sqlite 中。
也许我应该将[Object MR_createEntity]
交换为[Object MR_createInContext:context]
,因为该对象已创建但未插入到持久存储中?
【问题讨论】:
【参考方案1】:您在此处提供的代码是正确的。 shm 文件称为共享内存日志。而wal被称为Write Ahead Log。它们可以帮助 SQLite 更快地执行保存和获取。也就是说,您应该始终能够打开 sqlite 文件并查看数据存储中的内容。
有了这个,需要注意的是启用日志。可能您的数据未保存,因为您已按要求指定了属性但未填写。另外,您可能看错了地方o
【讨论】:
好吧,在这种情况下,我不会在 wal 和 shm 文件中看到这些数据,但是当我附加这两个文件时,我可以看到所有数据。使用外部编辑器打开这些文件后,这些文件将与 .sqlite 合并,从那时起,我可以看到仅使用 .sqlite 而没有 wal 和 shm 文件的所有内容。 那么将所有数据放入单个 sqlite 文件(就像以前一样)的最佳方法是查看 sqlite 的 pragma 选项并在设置商店之前设置适当的选项.创建商店后,SQLite 似乎没有响应对 pragma 设置的更新,但我可能在那里做错了......以上是关于神奇的记录 - 上下文(不保存)的主要内容,如果未能解决你的问题,请参考以下文章