问题标签 [nspersistentdocument]

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.

0 投票
1 回答
68 浏览

swift - 如何在 XCTestCase 中测试 NSPersistentDocument?

我刚刚使用 Core Data 启动了一个基于 OS X 文档的应用程序。为了测试我的模型关系,我想创建一些 NSManagedObject 实体,将它们保存到文件中,然后在 XCTestCase 对象中读回它们。使用如下代码,我可以在托管对象上下文中创建实体,但我无法弄清楚如何创建一个正常工作的持久存储协调器和/或保存到文件。

0 投票
1 回答
28 浏览

core-data - 从 NSPersistentDocument 中排除实体

我有一个现有的(并且可以正常工作的)应用程序NSPersistentDocument用于保存应用程序文件。
现在我需要创建一个新实体,这个新实体与应用程序文件完全无关,它将包含应用程序缓存,所以我将使用它来保存在一个单独的文件中。
我的项目包含MyDocument.xcdatamodeld使用 by NSPersistentDocument,以实现新功能我创建了一个新数据模型Cache.xcdatamodeld并向模型添加了一个新实体(我没有编写代码只是使用 XCode 向导)但是当我运行应用程序并尝试打开现有应用程序时文件我收到错误

开店模式与开店模式不兼容

我知道发生这种情况是因为新实体的模型配置相同,NSPersistentDocument但我该如何解耦呢?
在数据模型中创建新配置不起作用,因为无法从默认配置中删除实体。
知道如何NSPersistentDocument忽略新实体并继续使用旧数据模型吗?

我不发布源代码,因为这只是将新模型和实体添加到项目中

0 投票
1 回答
153 浏览

swift - NSPersistentDocument:浏览版本:尝试添加只读文件

因为我使用的是自定义核心数据堆栈,所以我覆盖了init, readFromURL, writeToURL, 和revertToContentsOfURL函数。

当我单击“浏览所有版本”时,我的文件的以前版本是 openend 并调用 init。但是我收到以下错误:

尝试在路径中添加只读文件...改为以只读方式添加。
这将是未来的一个硬错误;
您必须指定 NSReadOnlyPersistentStoreOption。

我现在的问题是:我如何知道正在打开的文件是普通文件还是版本文件?

0 投票
0 回答
205 浏览

cocoa - NSPersistentDocument 中的自动保存:两个文档使用同一个持久存储文件

在我的 NSPersistentDocument 子类中,我覆盖了这个函数:

我阅读了文档、头文件以及我在网上可以找到的任何内容。但我不完全明白我应该在这里做什么。我知道到目前为止我遇到了很多崩溃和奇怪的行为。我认为这与 NSPersistentDocument 使用错误的持久存储文件有关。

所以我这样做是为了看看会发生什么:

  1. 启动应用程序,
  2. 打开一个新文档,
  3. 等待它执行自动保存(AutosaveElsewhereOperation),然后
  4. 复制文件,并且
  5. 等待两个文档自动保存。

在函数开始时,我打印各种 URL。

此代码用于自动保存。

我得到以下输出

因此,在自动保存期间,我应该保存我的持久存储,或者,我猜,将其迁移到新位置。如果 appkit 希望我将商店迁移到新位置(例如,因为文件被复制),那么我希望 absoluteOriginalContentsURL 指向原始数据,absoluteURL 指向新位置。

但是 absoluteOriginalContentsURL 和 absoluteURL 总是相同的。更糟糕的是,我的持久存储指向两个文档的同一个文件(在磁盘上)。因此,如果我什么都不做,一个文档将覆盖另一个文档的数据。

但是在这个函数中,我不知道是将我的存储复制到 absoluteURL(数据被复制,持久存储不变)还是替换我的存储(当前存储从持久存储协调器中删除,添加新存储)。

澄清一下:如果我什么都不做,两个文档都使用同一个文件,而一个文档使用了错误的文件。重复文档的信息/存储错误。如果我迁移,则原始文档具有错误的信息或持久存储。

0 投票
2 回答
129 浏览

core-data - 由核心数据支持的 NSTextView

我在一个选项卡中有一个带有 NSTextView 的 NSTabViewController。文本保存在核心数据中。当视图消失时,我保存文本。

但是当文档本身关闭时如何保存文本?目前我节省了每次击键,但这可能太过分了。有没有更好的办法?

编辑:

0 投票
1 回答
328 浏览

macos - NSPersistentDocument 在“另存为”时崩溃

我的基于核心数据文档的应用程序在“另存为”时崩溃。该问题似乎类似于 cocoa-dev 线程中描述的问题,标题为“ NSPersistentDocument objects “gutted” after Duplicate, Rename in 10.9

主要区别在于:

  • 我在 OS X 10.10 Yosemite 上定位并运行
  • 使用“另存为”而不是复制
  • 崩溃发生得更早。在 MOC 保存期间

这个问题甚至影响最简单的 NSPersistentDocument。它至少从 2014 年就已经存在了。因此,我希望其他人也遇到过同样的问题,并且有一个你愿意分享的解决方法。

我的示例项目使用具有单个属性的单个实体。它有一个表格视图来显示实体的所有实例和一个按钮来创建一个新的。我偏离了默认模板只是为了禁用 autosavesInPlace。

重现崩溃的步骤是:

  1. 在优胜美地上构建和运行。该错误似乎已在 El Capitan 中修复
  2. 创建一个新文档
  3. 插入一个新对象
  4. 保存文档
  5. 关闭文档
  6. 重新打开文档
  7. 更改表中属性的值
  8. 使用“另存为”以新名称保存

在 OS X Yosemite 上,这总是会因以下回溯而崩溃:

编辑 1. 可能的解决方法:

我可以通过防止在“另存为”操作期间保存原始托管对象上下文来解决崩溃问题。“另存为”后,我立即关闭现有文档并从新位置重新打开该文档。这一切都非常难看,可能会破坏其他 NSPersistentDocument 行为。

编辑 2. 上述解决方法会丢失未保存的更改

防止保存原始托管对象上下文确实可以避免崩溃。然而,最终结果是文档的最后保存状态的副本。未保存的更改将丢失。

编辑 3. 内脏快照

当旧的托管对象上下文尝试将更改保存到新文件时,对象快照不再知道它的实体<_CDSnapshot_Entity_: 0x600001f3cfd0> (entity: (null); id: 0x40000b <x-coredata://83B64FD3-B5B9-44CB-976D-54C0326FDFF5/Entity/p1> ; data: (null))。我没有看到任何实例变量支持-[_CDSnapshot entity]。我认为它应该从对象 ID 中找到它。

0 投票
1 回答
294 浏览

swift - 在首选项控制器的基于文档的应用程序中获取 managedObjectContext

我有一个基于 OSX 文档的应用程序,用 Swift 编写,并且想将一些数据从我的首选项窗口控制器提交到我的 managedObjectContext 中。
因为首选项窗口似乎不是通过 NSPersistentDocument 调用,而是直接从 appDelegate 调用,所以获取该控制器的 managedObjectContext 的最佳方法是什么?到目前为止,大部分工作都是使用故事板和绑定完成的。
我是否认为如果我在应用程序委托中实例化一个核心数据堆栈,这会否定通过 NSPersistentDocument 提供的堆栈(这将违背事情的目的)?

0 投票
1 回答
516 浏览

swift - NSPersistentDocument、Swift、macOS 和故事板——如何获取 managedObjectContext?

回到 xib 和 nib 时代,我已经有一段时间没有处理 CoreData 和 macOS 了。使用 xib,有“文件所有者”可以让您访问您的文档和 managedObjectContext。简单的。

使用 NSPersistentDocument 和我的故事板,我遇到了一些先有鸡还是先有蛋的问题。在从 NSPersistentDocument 子类化的 Document 类中,我有以下内容:

这似乎是包括苹果在内的许多人所建议的。

我的问题是:在 MainViewController 中,我想要一个对象控制器,它需要绑定到 managedObjectContext,但是当它需要 managedObjectContext 时,我还没有将代表对象设置为 self。所以抛出异常。在 makeWindowControllers 方法的末尾设置代表对象为时已晚,但我看不到更早的时间。

0 投票
2 回答
123 浏览

objective-c - NSPersistentDocument 的 managedObjectContext 的并发类型可以改变吗?

我需要 NSPersistentDocument 的 managedObjectContext 的并发类型为 NSMainQueueConcurrencyType 因为我需要其他线程中的上下文。

0 投票
1 回答
159 浏览

swift - 基于文档的核心数据应用程序 - 添加和删除附加属性

我有一个带有实体“语言”的基于文档的核心数据应用程序。这个实体有两个永久属性“key”和“comments”。是否可以在运行时以编程方式添加和删除其他属性(“language_1”、“language_2”等)?

我的目标是避免在用户只需要很少的情况下创建带有 50 个属性的表(我不知道需要多少属性)。

或者也许我应该选择其他解决方案?:)

编辑

案例说明:当用户创建新文档时,表“语言”只有“键”和“评论”两个属性。在使用文档期间,用户可以随时添加或删除语言 - 我的意思是属性(列)而不是表中的行。

我的目标是拥有像下面这样的动态实体。

数据库解释

数据结构