问题标签 [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 投票
2 回答
469 浏览

macos - 沙盒环境中基于 SQLite 的 NSPersistentDocument

我正在尝试使用 Lion 中的新沙盒规则更新 Mac 应用程序。但是,尽管请求com.apple.security.files.user-selected.read-write了权限,我还是遇到了错误。当我查看日志时,我看到deny file-write-create /Users/thom/Desktop/Filename.blah-journal.

考虑到沙盒规则,这是有道理的——用户为 SQLite 存储选择了一个位置,因此允许写入该位置。但是,SQLite 将其日志文件与实际文件一起维护,并且禁止对其进行写入。

在这种情况下,SQLite 支持的 NSPersistentDocument 如何在沙盒环境中工作?

0 投票
3 回答
6200 浏览

ios - Mac / iPhone 应用程序 - 将核心数据同步到 iCloud 和设备(使用核心数据)

我正在使用使用 Core Data 的 iPhone 应用程序和 Mac 应用程序。

我想让这两个应用程序通过 iCloud 存储同步它们的数据库。

我已经从更新的食谱示例代码中对managedObjectContext& persistentStoreCoordinator& 添加的实现进行了调整:mergeiCloudChanges

当我构建/运行 myapp 时,我可以看到文件出现在我的“/Users/me/Library/Mobile Documents”目录中。
但我不知道它是否正在同步到 iCloud 存储 - 显然 iphone 和 mac 之间的数据没有同步。
我还需要实施其他方法来使数据迁移到云端吗?
有什么方法可以让我查看 iCloud 存储中实际有哪些文件?

0 投票
0 回答
212 浏览

cocoa - Cocoa(Mac):将基于核心数据的应用程序从/到多个保存文件中拆分/组合

我正在 OS X Lion 上基于 Core Data 的 Cocoa 应用程序工作,我需要能够将数据模型的不同部分(比如 partA 和 partB)保存到单独的文件中。

我需要能够将两个文件一起保存为项目文件/包,但还需要能够独立于 partB 加载和保存 partA。

加载新的 partA 文件应替换当前与 partA 关联的所有数据。保存partA 不应该保存partB 中更改的数据。

A 部分中的实体确实需要与 B 部分中的实体保持关系,但这些可能(并且很可能必须)很弱。

我的主要问题是:实现所需功能的最佳方法是什么?


我的第一种方法是NSManagedObjectModel包含两种配置,每个部分一个配置。我为每个配置NSPersistentStore分配了两个实例。NSPersistentStoreCoordinator和一个分配给它NSManagedObjectContext的实例。storeCoordinator

保存和打开单独的文件目前是我在这个方法中的主要关注点。NSManagedObjectContext -save:消息似乎保存了这两种配置。是否可以只保存对属于特定配置的对象所做的更改NSManagedObjectModel?或者我需要两个NSManagedObjectContext实例,每个配置一个?

通过向 for partA 添加存储来打开文件persistentStoreCoordinator会将数据添加到上下文中,到目前为止我还无法替换数据。有没有办法知道哪个商店与某个配置相关联,也许是通过向 发送消息persistentStoreCoordinator

我也在考虑第二种方法:NSPersistentDocument为我的数据模型中的每个配置设置两个子类,以便能够将数据保存到单独的文件中。但我不确定拥有两个单独的实例是否允许在不同配置中的子类NSManagedObjectContext之间建立关系?NSManagedObject

如果有人有一个好主意或可以指出我正确的方向,甚至有我如何实现上述功能的示例,那将不胜感激。

0 投票
1 回答
466 浏览

cocoa - CoreData 未将类型设置为 XML

我很难调试我的数据(CoreData、NSPersistentDocument)的问题。

我有一个 NSPersistentDocument 的子类。我正在使用 NSManagedObject 子类/标准核心数据模型。我在 NSPersistentDocument 或 NSManagedObject 类中没有做任何特别的事情。我只是在创建一个对象(在 NSPersistentDocument 的子类中):

当我尝试将文档保存在我的应用程序中时,有一个文件格式下拉菜单。它包括二进制(默认)、SQLite 和 XML。我将文件保存为 XML。当我尝试查看它(使用较少,甚至在 Finder 中打开)时,我发现该文件存储为二进制文件。

有什么特别的东西我需要去强制它到 XML 吗?

根据 Apple 的文档,我的理解是,在使用 NSPersistentDocument 子类时,我不需要进行设置 NSPersistentStore 或 NSPersistentStoreCoordinator 的工作。我的理解是所有这些都是免费的。同样根据我的阅读,XML 是默认设置。

0 投票
1 回答
690 浏览

core-data - CoreData 自动保存并在自动保存后不加载所有数据

我有一个 NSPersistentDocument 子类,它使用 NSManagedObject 子类来存储我的数据。

当打开一个新文档时,我会对数据结构进行一些初始化(填充字段的数量很少)。我注意到的是 Untitled 文档被自动保存,当应用程序重新打开时,该文档被加载。如果应用程序退出,用户不会(默认情况下)收到保存对话框的提示。如果窗口关闭,则用户关闭。

第一个问题:

我想在用户退出应用程序时调用保存对话框。我不希望这个无标题的文档到处乱跑(在正常情况下)。我要么希望它保存或丢弃。

我试图填写:

为了触发要保存的文档。此时调用save:上下文会出错。据我所知,这是因为用户还没有自己保存文件。此外,调用[self close];[[self windowForSheet] close];关闭窗口而不保存。

如何强制弹出保存对话框?如何删除未命名的文档?

第二个问题(不,我数不清):

因为当应用程序启动时,可能有也可能没有 Untitled 文档要处理,所以我试图跟踪另一个模型中的状态。我已经发现,当 Untitled 文档出现时,初始数据(我之前提到的)已经存在。我的另一个模型有一些元数据,包括填充数据的成功标志/状态。一旦填充的数据全部到位并正确,状态就会显示为这样。不幸的是,虽然当应用程序以预先存在的无标题文档启动时加载了我的填充数据,但元数据类不是。

请原谅代码的粗糙,在这一点上,我正在修改它,直到我可以看到它在我修改它之前可以按照我想要的方式工作:

请注意,数组始终存在,并且计数始终为零。不,我没有明确地save:在任何地方打电话。我依赖于标准的自动保存,或者用户执行保存。

编辑:

我安装了核心数据编辑器应用程序。事实证明,问题不在于保存数据,而在于加载数据。(注意:由于另一个问题,应用程序在指示另存为 XML 时会另存为二进制文件,这会导致头疼。)

我已将其分解为最简单的代码,它应该在一个数组中获取所有 GameState 类型的对象。尽管在保存的文件中显然存在适当类型的对象,但它没有检索到:

数组不为空,而是[array count]为 0。

在这一点上,我猜我忽略了一些简单的事情。

第二次编辑:

我添加-com.apple.CoreData.SQLDebug 5并保存为 SQLite。调用executeFetchRequest不会生成任何调试日志。我确实看到该INSERT INTO ZGAMESTATE条目出现在日志中。似乎executeFetchRequest没有传递到后端。

第三次编辑(这个烧伤):

我创建了一个新的 xcode 项目,使用核心数据(就像我使用其他数据一样)。我只复制了这一个函数(必要时存根)并在windowControllerDidLoadNib. 在这个新项目中,上面的代码有效。

0 投票
4 回答
5615 浏览

objective-c - NSPersistentDocument 的轻量级迁移

我正在尝试对 Core Data 中的 SQLite 存储进行轻量级迁移。使用 Xcode 4.3.1 在 Lion 10.7.3 上工作。

在我的 NSPersistentDocument 子类 (AccountDocument) 中,我重写了用于配置持久存储协调器的方法,以便它获得正确的迁移选项:

(感谢 Malcolm Crawford 的提示:http ://homepage.mac.com/mmalc/CocoaExamples/controllers.html )

当我运行该应用程序时,它在 NSPersistentDocument 的实现中失败-managedObjectModel

从文档中我可以看出,默认实现如下所示:

因此,为了进一步调试问题,我使用以下方法覆盖了该方法:

(感谢 Jeff LaMarche 的想法:http: //iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html

捆绑包和 url 都指向我期望的位置(并且我已按照 Marcus Zarra 的建议清理项目,因此应用程序包中没有任何杂散的 .mom 或 .momd 捆绑包:使用 mergeModelFromBundles:和版本控制(CoreData))。然而,应用程序在从 url 加载模型时继续崩溃。

我检查了 AccountDocument2.xcdatamodeld 是一个包含两个版本控制模型的包:AccountDocument 2.xcdatamodel 和(原始)AccountDocument.xcdatamodel。文件属性中的“Versioned Core Data Model”弹出菜单设置为“AccountDocument 2”。

两种模型之间的唯一区别是一个实体有一个额外的(和可选的)属性。我的理解是,这使模型有资格进行轻量级迁移。

显然,我在这里做错了什么,但我不知道是什么。任何帮助将不胜感激……</p>

更新:

根据 Martin 的建议(以及对 NSPersistentDocument 文档的检查),我尝试将以下代码用于访问器:

还在崩溃……</p>

更新

在 Twitter 上提出一些建议后,我升级到 Xcode 4.3.2,但问题仍然存在。

愤怒更新

我刚刚在 Snow Leopard 上使用 Xcode 4.2 创建了版本化模型包 (AccountDocument2.xcdatamodeld)。构建并运行应用程序后,一切都按预期工作。

然后我将 AccountDocument2.xcdatamodeld 文件包带回 Lion 和 Xcode 4.3.2。当我构建并运行该应用程序时,它在加载 .momd 资源时继续崩溃。是的,孩子们,这意味着 Xcode 4.3.x 和数据模型编译器 (MOMC) 是罪魁祸首。除了在 Snow Leopard 上进行所有构建之外,我没有看到其他解决方法。

我不是抨击 Xcode 4 的人,但是当我们发现自己处于工具链无法从不透明规范(.xcdatamodel 和 .xcdatamodeld)生成不透明文件(.mom 和 .momd)的情况下,很难对 Mac 和 iOS 工具的状态持乐观态度。荒谬的是,这些平台的核心组件损坏到我无法在最新版本的 SDK 和开发人员工具上构建和运行我的应用程序的程度。

它来到了这个更新

更多证据表明这是 Xcode 4.3.2 中数据模型编译器 (MOMC) 的一个严重错误:如果我将 Xcode 4.2 创建的 Resource 文件夹中的 .momd 包复制到我的项目中,并将它们作为复制文件添加到构建中构建阶段,应用程序工作正常。

我还做了一些测试,删除了各种实体的属性的验证规则和默认值(基于下面 Marcus 的建议。)没有变化,编译器仍然会创建一个无效的 .momd。我还尝试创建一个没有任何更改的版本化模型:编译后的 .momd 继续崩溃。因此,无论您在当前模型中拥有什么(以及它们所代表的数据)都是问题的根源。

另请注意:此错误并非孤立于 NSPersistentDocument (正如我在开始此问题时最初所想的那样。)我可以通过使用[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL].

现在,我将在 Snow Leopard 上使用 Xcode 4.2 编辑/版本控制我的模型,并将编译后的资源转移到 Lion 上的 Xcode 4.3.2。如果您以任何方式使用 Core Data,我建议您在解决此错误之前也这样做。相信我,如果你不这样做,你会花几天时间弄清楚到底发生了什么。

现在提交雷达…</p>

雷达更新

我刚刚提交了这个雷达:

http://www.openradar.me/11184500

哦,废话,它一定是狮子更新

我刚刚从http://developer.apple.com/downloads下载并安装了 Xcode 4.2 for Lion 工具。Radar 中使用的示例应用程序仍然崩溃。

(注意:您不能安装 Xcode 4.2.1,因为用于签署 DeveloperTools.pkg 的证书已过期。只有 Xcode 4.2 可以使用。)

如果您处于 NDA 之下,您还会发现 beta 工具也无济于事。

希望您有一份带有 Xcode 4.2 的 Snow Leopard 副本:http: //furbo.org/2012/03/28/vmware-for-developers/

WTF 获取请求与版本化实体和属性更新有关

通过 Evadne Wu 在 Twitter 上:

https://twitter.com/#!/evadne/status/187625192342818818

以及她是如何做到的:

https://twitter.com/#!/evadne/status/187629091518816258

(.mom 文件是二进制 plist。)

问题的根源在于单个 Fetch Request。这如何影响数据从一个模型到另一个模型的迁移需要 Apple 的一位工程师来弄清楚。

0 投票
1 回答
359 浏览

macos - 将 NSPersistentDocument 与备用保存格式一起使用是不是很糟糕?

我正在考虑制作一个基于核心数据的以文档为中心的应用程序,但我希望保存的文件格式是我自己的 XML、图像和其他东西的专有包。

我的计划是使用 NSPersistentDocument 的子类,当接收到 -writeToURL、-readFromURL 等调用时,它会在我的文件格式和核心数据之间来回序列化。

这是反模式吗?我已经开始尝试它,它似乎可以工作,但我没有看到太多关于这种方法的文档/讨论,这让我停下来。

0 投票
1 回答
212 浏览

macos - 将自定义 NSManagedObjectContexts 与 NSPersistentDocument 一起使用

我有一个 NSPersistentDocument。当我使用默认的 managedObjectContext 时,它的行为符合预期:添加新对象时,窗口显示文档已“编辑”,当我退出新的无标题文档时,会出现“另存为”表。

但是,当我用我自己创建的一个(私有队列)替换默认 managedObjectContext 时,所有这些行为都消失了。当对文档进行编辑时,文档似乎无法识别,并且新的、无标题的文档只是关闭而没有出现“另存为”表。尽管 [managedObjectContext hasChanges] == YES,这一切都发生了。

任何想法将不胜感激。

0 投票
3 回答
1480 浏览

macos - NSDocument:无法自动保存文档。该文件已被另一个应用程序更改

搜索这篇文章的标题会发现它很常见;确实,我从 Xcode 得到了这个错误。但我似乎找不到任何修复方法。我现在在运行程序时看到它,它似乎发生在调用 changeCountTokenForSaveOperation 期间或之后。它似乎与撤消管理器有关,而不是与我使用核心数据的事实有关,但我可能错了。

有谁知道这是什么原因或如何解决它?

0 投票
1 回答
72 浏览

macos - 使用更新的 Core Data 模型打开应用程序时磁盘上的文件更改

我有一个 OS X 应用程序,它依赖 NSPersistentDocument 和 Core Data 来处理应用程序的自定义文件类型(保存为 XML)。

我注意到,当我更新我的核心数据模型(我正在做简单的更改,依赖于轻量级迁移)时,只需使用使用新模型的应用程序打开一个文件就会更改磁盘上的文件。原始文件的备份版本也出现在磁盘上(文件名后附有“~”)。一旦发生这种情况,应用程序的先前(已发布)版本就无法打开该文件。

需要明确的是:我只是打开文件。我没有将文件保存回磁盘。我可以在 Finder 中观看,并在打开文件后立即看到“~”。

这似乎是非常危险的行为。我必须非常谨慎,永远不要打开我的用户群当前正在使用的文件,因为这样做会立即使他们无法访问。

这是默认的 OS X 行为吗?有没有办法配置 NSPersistentDocument 或我的核心数据模型,以便打开文件将内部存储更改为应用程序,但除非我明确保存,否则更改不会传播回磁盘?