0

我正在尝试更新基于 CoreData 的应用程序以满足在沙盒中运行的要求。然而,事实证明,迁移很困难。似乎 NSPersistentDocument 试图就地进行迁移,并希望在未经用户许可的情况下保存到磁盘。因此,轻量级迁移失败。

我只能想象我需要避免在磁盘上进行迁移的人,但我不知道如何在 NSPersistentDocument 中执行此操作。有人建议继承 NSDocumentController 并覆盖 makeDocumentForURL:... 以检查是否需要迁移。我假设当时的逻辑是创建一个新的无标题文档并将数据迁移到该文档,但我不确定这是否是最佳方法或应该考虑哪些其他方法。

我应该如何为沙盒核心数据应用程序执行迁移?

4

2 回答 2

1

我能够通过临时权利解决它。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
    <key>com.apple.security.temporary-exception.files.absolute-path.read-write</key>
    <string>/Volumes/</string>
    <key>com.apple.security.temporary-exception.files.home-relative-path.read-write</key>
    <string>/</string>
</dict>
</plist>

就像没有启用沙箱一样,自动迁移就可以工作了。

但是,它本质上是禁用了大部分沙盒,所以我不确定苹果在应用商店批准时会如何反应。

在 developer.apple.com 上,当您发现自己不得不使用临时权利时,他们建议您提交错误。

于 2012-06-19T21:58:25.727 回答
0

我发现解决方案比我想象的要复杂。因为有很多代码我在日记上写了答案:http: //www.codeotaku.com/blog/2012-06/sandboxing-core-data-and-migrations

不过,这里有一个简短的总结:Core Data 尝试迁移数据并就地写入文件。这在沙盒中不起作用,因为您只有对该文件的只读访问权限。因此,Core Data 迁移失败。就我而言,我劫持了文档创建过程以检查是否需要迁移,如果需要,请用户(通过提供 NSSavePanel)为迁移的数据选择一个位置。然后,迁移任务被传递给一个专门的类,并在合适的临时目录中进行迁移。最终数据被复制回用户指定的位置,然后打开该文档。

于 2012-06-10T13:29:14.540 回答