问题标签 [nspersistentstore]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 无法在新开发机器上创建具有 nil 模型的 NSPersistentStoreCoordinator
我刚刚设置了一台使用 Xcode 进行开发的新机器,当我打开、构建和运行现有的核心数据项目(它仍然在我的旧机器上完美运行)时,我收到“无法使用 nil 模型创建 NSPersistentStoreCoordinator “ 错误。
我已经阅读了有关此错误的无数关于 stackoverflow 的问题,感谢他们,我对 iOS 如何处理数据库对象模型有了更好的理解,据我所知,没有什么明显的问题。
我正在为我的托管对象模型使用标准初始化方法,即...
...在我的旧机器上返回一个不错的 NSManagedObjectModel,但在我的新机器上返回 nil。
正在编译的包确实包含一个 project.momd 文件夹,该文件夹又包含一个 project.mom 文件,它与我的旧机器上的编译输出完全相同,但一个运行而一个不运行!非常令人沮丧!
我唯一能想到的是 Xcode 中有一些配置选项我没有在新机器上正确设置,但任何帮助或建议将不胜感激!
* 更新 *
我的新机器上的包在 Project.momd 中包含一个 project.mom。在我的旧机器上,Project.mom 在 Project.momd 内部,我猜模型名称是区分大小写的,所以我只需要破译为什么 xcode 以小写形式编译 mom...
在包中手动将 project.mom 重命名为 Project.mom 确实可以解决问题,尽管在重新编译项目之前是暂时的。
core-data - 设置持久存储和父上下文
当NSManagedObjectContext
持久存储和父上下文都设置并调用保存时会发生什么?它会将数据一一推送到持久存储和父上下文吗?还是会同时进行?或者核心数据会简单地抛出一个抱怨的异常吗?
API 不会直接阻止一个给定上下文设置两个“父母”。
ios - NSIncrementalStore 子类中的乐观锁定支持
我正在实现一个自定义NSIncrementalStore子类,它使用关系数据库进行持久存储。我仍然在努力解决的一件事是对乐观锁定的支持。
(请随意跳过这个冗长的描述,直接回答我下面的问题)
我分析了 Core Data 的 SQLite 增量存储是如何通过检查它产生的 SQL 日志来解决这个问题的,并得出以下结论:
数据库中的每个实体表都有一个Z_OPT列,该列指示该实体(行)的特定实例已被修改的次数,从 1(初始插入)开始。
每次修改托管对象时,其相应数据库行中的Z_OPT值都会增加。
存储维护NSIncrementalStoreNode实例的缓存(在 Core Data 文档中称为行缓存) ,每个实例都有一个版本属性,该值等于先前对托管对象行的SELECT或UPDATE SQL 查询返回的Z_OPT值。
当一个托管对象从NSManagedObjectContext返回时(例如,通过对其执行NSFetchRequest),MOC 创建包含该版本号的该对象的快照。
当对象被修改或删除时,Core Data 通过比较缓存行和对象快照的版本来确保它没有在上下文之外被修改或删除。所有这些都发生在对象所属的上下文中调用-save:时。如果版本不同,则根据设置的合并策略检测和处理合并冲突。
保存 MOC 时,为每个修改/删除的对象调用-newValuesForObjectWithID:withContext:error:方法,该方法又返回带有版本号的NSIncrementalStoreNode 。然后将此版本与快照的版本进行比较,如果它们不同,则保存失败并出现适当的合并冲突(至少使用默认合并策略)。
这个简单的用例适用于我的商店,因为-newValuesForObjectWithID:withContext:error:首先检查行缓存,如果对象在其他上下文中使用相同的商店实例同时修改就足够了。如果是这种情况,则缓存包含具有更高版本号的更新行,足以检测到冲突。
但是,我如何才能检测到底层数据库是否已在我的商店之外被修改,可能是由其他应用程序或其他商店实例使用相同的数据库文件?我知道这是一个不常见的边缘情况,但 Core Data 可以正确处理它,我更愿意这样做。
Core Data 的存储使用这些 SQL 查询来更新/删除对象的行:
其中:
X - 存储区最后知道的版本号(来自缓存)
Y - 新版本号
如果这样的查询失败(没有行受到影响),该行将在存储的缓存中更新,并将其版本与先前缓存的版本进行比较。
我的问题是:自定义NSIncrementalStore如何通知核心数据某些更新/删除/锁定的对象发生乐观锁定失败?只有商店才能知道当它处理传递给它的NSSaveChangesRequest时,它的-executeRequest:withContext:error:方法。
如果存储下的底层数据库没有更改,那么会检测到冲突,因为 Core Data在对存储执行保存更改请求之前对每个修改/删除/锁定的对象调用-newValuesForObjectWithID:withContext:error:。我无法找到任何方法让NSIncrementalStore通知 Core Data 在它开始处理保存请求后发生了乐观锁定失败。有没有一些无证的方法可以做到这一点?在这种情况下, Core Data 似乎抛出了一些异常,然后神奇地转换为失败的保存请求,其中 NSError 列出了所有冲突。我只能通过从-executeRequest:withContext:error 返回 nil 来部分模仿这一点:并自己创建错误消息。我认为在这种情况下也必须有一种方法可以使用标准的 Core Data 冲突处理机制。
core-data - 未在 UIManagedDocument 上创建 NSPersistentStoreCoordinator
我开始了解UIManagedDocument
它的能力。据我了解,它是一种存储在文档目录中某个位置的数据库形式。
无论如何,我试图将它用作数据库,通过将数据存储在其中NSManagedObjectContext
但是,在创建UIManagedDocument
数据并将数据保存到其上下文几秒钟后(在我猜测超时之后),应用程序崩溃并告诉我没有持久的存储协调器。
Apple 文档上似乎没有太多关于如何在创建托管文档后创建持久存储协调器的指导。
我该怎么做?
谢谢!
编辑
我正在使用的代码:
更新
在后台线程上执行此代码后。打开文档后,我的应用程序仍会在完成处理程序上成功记录“否”。但是,我的应用程序没有崩溃,而是得到以下日志:
此方法还创建一个“DocumentMetaData.plist”(根据我在评论中提到的 CS193P 视频中提到的这些文件,我认为这是必要的)而不是一个名为“persistentStore”的文件。
ios - 每次我向 CoreData 文件添加一些东西时,我都会得到 sigabrt
每次我向 CoreData 添加一些东西(比如向其中一个实体添加属性)时,我都会得到 sigabrt,唯一有帮助的就是从模拟器中删除应用程序并清理项目。我添加了一个异常断点,这是中断的函数:
如果我取消注释 abort() 应用程序工作但它不会访问数据,我该如何解决这个问题,以便我可以添加一个属性而无需每次都删除所有内容?
编辑:添加了错误。
编辑:将功能更改为:
现在它运行程序但它仍然不显示数据
core-data - 从 ViewController 刷新 AppDelegate 中的 NSPersistentStoreCoordinator
我有一个应用程序,其中在 AppDelegate 中设置了 PersistentStoreCoordinator。我想从保存的 sqlite 文件列表中加载一个新的 sqlite 数据库。我很高兴删除现有的 Persistent Store 和 sqlite 文件并将 sqlite 文件替换为从表中加载的文件。但是,如何从选择新文件的 ViewController 操作中重新加载/刷新 PersistentStoreCoordinator?我尝试将 AppDelegate 设置为 ViewController 的委托,但这似乎会在应用程序中创建各种循环引用。另外,重新加载 PersistentStoreCoordinator 的精确方法是什么?
我已经尝试过这段代码,但它只是清除了持久存储而不刷新加载的 sqlite 文件(Working.sqlite 是当前运行的 sqlite 数据库版本的名称):
好的 - 我现在修改了下面的代码,当我选择要加载的行时,当我最终将新商店添加到 PSC 时,我现在遇到了崩溃。错误代码都是空的,所以我不确定是什么失败了。NSLogs 显示原始存储已被删除,并复制了新版本。
Marcus - 我认为这反映了您的建议,但我仍然让应用程序在 addPersistentStore 阶段崩溃,并显示“未解决的错误”日志:
按照 Marcus 的建议,我在上面修改后的代码中添加了 removePersistentStore 上的错误日志。问题出现在删除操作中。日志文件结束如下:
2013-06-01 01:10:02.478 inControl[1238:907] 持久存储是:file://localhost/var/mobile/Applications/D34C6065-8D59-480F-ABA4-9F10C690F26C/Library/Working.sqlite
2013-06-01 01:10:02.481 inControl[1238:907] 在被删除之前它就在那里
2013-06-01 01:10:02.486 inControl[1238:907] 删除时未解决的错误 (null), (null)
遵循 Marcus 的建议的最终工作代码:
ios - 同时保留来自 2 个不同核心数据模型的实体的引用
我的 iOS 应用程序中有 2 个不同的核心数据模型。UserDetail
在第一个 VC 中,我在我设计的单例类中创建了对实体的引用。
用户离开这个 VC 后,我使用另一个核心数据模型,与第一个完全不同。我更改了objectModel、objectContext 和persistentStore。
似乎在我更改为第二个核心数据模型后,我失去了对UserDetail
我一开始创建的实体的引用。
提取后,我像这样保存参考:
并且在我尝试访问sharedInstance.account
它时更改核心数据模型后为零。财产应该是(副本)吗?
我错过了什么吗?
谢谢
ios - 重新创建持久存储后的核心数据错误
在我的应用程序中,我能够从数据库中清除所有数据。此操作完成后,将解析捆绑的 JSON,然后将其保存到数据库中(以便将数据库返回到默认状态)。解析和保存此 JSON 的操作在任何情况下都可以正常工作,除非在清除和重新创建持久存储之后,在这种情况下我得到“NSInvalidArgumentException”,原因是:“无法从此 NSManagedObjectContext 的协调器访问对象的持久存储”。在后台上下文中保存后尝试在我的主线程上下文上调用 mergeChangesFromContextDidSaveNotification 时会引发此异常。
重新创建存储是在主线程上执行的,而解析和保存总是在后台线程上进行。这是我的托管对象上下文的 getter,以确保线程安全:
newManagedObjectContext 方法为所有新实例提供相同的 NSPersistentStoreCoordinator 对象。
这是用于清除存储的代码(始终在主线程上执行):
奇怪的是,同样的代码在其他项目中运行良好,除了数据的内容之外没有任何区别。任何帮助是极大的赞赏!
iphone - NSIncrementalStore - 使用本地和远程数据
我已经阅读了几篇有关的文章NSIncrementalStore
,但我仍然对整个概念感到困惑。在这篇文章中,我们可以读到:
本质上,您现在可以创建 的自定义子类
NSPersistentStore
,这样您就无需NSFetchRequest
访问本地 SQLite 数据库,而是运行您定义的方法,该方法可以执行任意操作以返回结果(例如发出网络请求)。
到目前为止,我认为 NSIncrementalStore 是访问远程数据并在本地保存/缓存它的完美解决方案。现在,我推断它是一种仅用于访问远程数据的解决方案。
如果我是对的,我将感谢任何关于解决方法的建议。如果我错了,魔法在哪里以及如何实施?NSIncrementalStore 上的每篇文章/文章/教程都展示了从服务器提取数据是多么容易,但没有一个给出关于缓存内容以供离线查看的单一线索。
回答,让我们考虑一个常见的场景,一个应用程序应该从互联网上下载一些数据,显示并保存在本地,以便用户可以离线使用该应用程序。
另外,我不承诺使用 NSIncrementalStore 或其他东西。我只是在寻找最好的解决方案,而这门课被该领域的一些最优秀的专家描述为其中之一。
ios - 如何删除 iCloud 中的数据
我一直在努力将 iCloud 存储迁移到应用程序沙箱中的本地存储。代码如下所示(为清楚起见,已删除错误处理代码):
至此我们已经成功将iCloud store迁移到了应用沙箱中的新位置,但是iCloud中还有数据和旧的sqlite文件在原地……下面一行删除了sqlite文件
因此,在运行所有这些之后,据我所知,我的文件系统和持久存储看起来不错。缺少的一点是存储在 iCloud 中的数据不会从 iCloud 中删除(尽管应用程序不再访问它)。以编程方式删除 iCloud 数据还需要做什么?苹果 iCloud 文档提到删除事务日志,但我的 Documents 文件夹中没有任何其他需要清理的文件。任何帮助深表感谢!
更新:
iCloud 商店最初是使用以下选项设置的: