问题标签 [uimanageddocument]
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.
iphone - 如何在不同对象之间共享一个 UIManagedDocument?
我已经查看了如何使用块为我的整个应用程序共享的每个磁盘上的文档创建一个全局 UIManagedDocument 实例?但我真的不明白。
我想要实现的是整个应用程序应该只有一个 UIManagedDocument - 一个核心数据数据库。不同的对象应该调用一个方法并获取唯一的 UIManagedDocument。
我使用带有类方法的辅助类:
从问号可以看出,我不知道如何获取现有文件。我检查了 UIManagedDocument 类参考,但找不到它。
你能帮我吗?提前谢谢了。
编辑 我想知道......单例方法怎么样,例如:
core-data - Core Data 托管对象在重启模拟器之前看不到相关对象
有一个Stumper(至少对我来说)。
我正在使用带有 ARC 的 iOS 5.0 和 UIManagedDocument 中的核心数据。
我有一个实体(组)与实体(人)有一对多关系(称为人)。当我添加一个新组,然后添加一个新人员(将人员的 .group 关系设置为新组)时,我无法使用 Person 实体上的谓词检索相关人员 where ("group == %@", myGroup )。我还尝试使用 Group 的 addPerson 设置器。
如果我关闭 XCode 模拟器并重新运行它,它会识别上一次运行中创建的关系,我什至可以将新人添加到现有的 Group 对象中。我只是无法添加新组,然后在不关闭模拟器(或设备,如果我在设备上运行)的情况下添加人员以查看关系。
如果我做一个 [group.people count],在添加新组和相关人员之后立即给我正确的数字。但是在我重新启动应用程序之前,带有谓词的提取不起作用。
似乎 UIManagedDocument 的 managedObjectContext 没有看到这种关系。我试过保存上下文、保存 context.parentContext 和保存文档。这些都没有帮助。
任何想法,将不胜感激!
core-data - 我应该在 UIManagedDocument 中使用 NSFileWrappers 吗?
我正在尝试将一个 plist 和几个二进制文件(比如说图像)存储为 UIManagedDocument 的一部分。二进制文件的名称是 Core Data 中的一个属性,我不需要枚举它们,只需在显示相关实体时访问正确的名称即可。
我想要的文件结构是:
到目前为止,我已成功按照如何将其他内容保存到我的 UIManagedDocument 文件包中的说明进行操作?,但是当我尝试添加二进制文件时,有些事情我不知道该怎么做。
- 我是否应该将 URL /the/path/File yyyyMMdd-HHmmss.extdoc/ AdditionalContent(readAdditionalContentFromURL:error: 提供的默认内容)视为 NSFileWrapper?与仅使用 URL 相比,有什么优点/缺点吗?我发现使用文件包装器更复杂,因为必须使用文件包装器访问器和 NSCoder(我猜)和文件来读取 plist,我必须存储图像目录的文件包装器,然后获取相应的带有 objectForKey 的节点(我假设)。但 Apple 的 iOS 文档基于文档的应用程序编程指南关于自定义格式而不是 NSData 或 NSFileWrapper 指出“请记住,您的代码将不得不复制 UIDocument 为您所做的工作,因此您必须处理更大的复杂性和更大的错误可能性。“我是不是误会了?
- 每个文档的默认值被声明为属性:setter 修改映射 plist 的 NSDictionary 并将文档标记为已更新,getter 使用正确的键访问字典。如何公开读取/写入二进制文件的能力?我应该向 UIManagedDocument 的子类添加方法吗?- (void)writeImage:(NSString*)uuid; 和 -(UIImage *)readImage:(NSString *)uuid; 我是否应该将这些数据保存在内存中,直到文档被保存?如何?
- 假设 NSFileWrapper 是要走的路,如果我打算将此文档与 iCloud 一起使用,我应该将文件协调器与文件包装器一起使用吗?如果是这样,怎么做?
每个问题的任何源代码将不胜感激。谢谢你。
PS:我知道我可以在 Core Data 中保存一些二进制数据,但我对那个解决方案感到不舒服。除其他原因外,如果我想创建桌面应用程序,我宁愿将 PNG 数据存储为 UIImage 的序列化版本与 NSImage 不兼容的图像文件。
ios5 - 使用未声明的标识符“NSMigratePersistentStoresAutomaticallyOption”
我在下面声明代码语句时怎么会出现这个错误?
使用未声明的标识符“NSMigratePersistentStoresAutomaticallyOption”
为了让它识别我的 NSMigratePersistentStoresAutomaticallyOption 常量,我缺少什么?
谢谢,
麦克风
core-data - Migration issues with UIManagedDocument
I started using CoreData in my application following Stanford CS193P lessons regarding the use of iOS 5's new class UIManagedDocument. The approach itself is quite straightforward but I can't understand how to deal with model modifications i keep making. This is how I instantiate my UIManagedDocument object (inside the appDelegate, so that every other class can use it):
The issue I have is that every time I change even a little bit of my .xcdatamodel, I am unable to get all the content previously stored in the document as well as to create any new instance. As a matter of fact doing this generates the following exception:
I thought setting the "options" property of the managed document would have solved the problem, but apparently this isn't enough. Anyone can help? Couldn't' find other questions that actually fit my precise needs.
ios - 核心数据:NSManagedObjectContext、NSFetchResultsController 和 UIManagedDocument
我在使用后台线程更新UIManagedDocument
/中的数据时遇到了一些麻烦Core Data
。具体来说,我正在使用NSFetchResultsController
基于来自后台线程的地理编码数据更新地图注释(在合并回我的主 MOC 之后),但由于UIManagedDocument
将数据提交到其存储和/或其多个 MOC的方式,地图永远不会更新(父母和孩子)。如果我关闭应用程序并重新打开,注释会被填充,因此在某个时候会发生对持久存储的提交,但我不清楚如何强制执行这样的提交,从而更新NSFetchResultsController
. 这是一些代码:
更新 MOC 的后台线程:
当调用这些保存时,我在主线程(在我的应用程序委托中)获取通知,如下所示:
而且我已经像这样设置了我的获取结果控制器(谓词是正确的,在数据提交到商店后重新启动应用程序时结果与预期一致):
关于如何更新适当的 MOC 以使获取的结果控制器按预期运行的任何想法?
core-data - UIManagedDocument + iCloud“大图”?
我正在开发我的第一个“iCloud App”。我研究了 Apple 文档和斯坦福视频,但我仍然难以理解 iCloud 的“大局”。
我的目标是创建一个“图书馆风格”应用程序(这是 Apple 对具有“具有单个持久存储协调器和单个持久存储的单个核心数据堆栈”的应用程序的术语),例如员工示例。
在斯坦福视频之后,我使用 UIMangedDocument 来设置所有核心数据内容并启用 iCloud 功能。UIMangedDocument 包含数据库并“存储在云中”。
这已经是我纠结的第一件事:“存储在云端”到底是什么意思?
在我开始使用 iCloud 之前,我认为“将文档存储在云中”意味着“将文档的副本存储在云中”。我认为在常规沙箱中会有我的文档的本地版本,在云中会有文档的副本。每当更改本地文档时,这些更改也会传输到云版本。据我所知,这是不正确的(至少不完全正确)。我对吗?
要使用 iCloud,我要做的第一件事就是调用URLForUbiquityContainerIdentifier:。这将返回“iCloud URL”,即云中文件夹的 URL。存储在此 URL 下的所有文件都将“存储在云中”,对吗?
我的第一个假设(本地文件+云中的副本)并非完全错误。事实上,存储在云中的任何文件都有“本地版本”和“云版本”。这是因为即使设备当前没有 Internet 连接,我也可以访问 iCloud URL 并将文件存储在此位置。但这只是 iCloud 框架的神奇之处,我无需费心。从我的角度来看,云只是一个特殊的文件夹,该文件夹中的任何文件或目录都存储在云中。如果在设备设置中禁用了 iCloud,则 iCloud URL 将为 NIL。那正确吗?
我挣扎的第二件事是 iCloud 如何将更改同步到文档。假设设备 A 上的“TheApp”创建了一个 UIManagedDocument 并存储在云中。在该设备 A 脱机后。同时,设备B上的TheApp访问文档并添加一些数据(例如插入一些新员工或部门)。当设备 B 再次上线时,它会收到NSPersistentStoreDidImportUbiquitousContentChangesNotification并可以合并所有调用mergeChangesFromContextDidSaveNotification:对文档的 managedObjectContext 来复制这些更改。
我无法确定合并更改是否真的有必要。如上所述,从我的角度来看,只有一个 Document。如果这是真的,我很高兴收到有关更改的通知,但不必将这些更改复制到文档的“本地版本”,因为没有“本地版本”之类的东西。这让我想到了什么 mergeChangesFromContextDidSaveNotification: 有好处。
另一种情况与之前的情况相同(在设备 A 上创建文档,在设备 B 上更改...),但现在设备 A 不仅离线,而且在设备 B 上进行更改时,TheApp 完全关闭。在这种情况下,TheApp设备 A 上的文档在再次启动后必须重新创建/重新打开。在这种情况下应该怎么办?
我确实进行了一些测试,但结果并不总是相同。在某些情况下,文档从其“旧”版本开始,然后收到更改通知。在其他情况下,该文档直接在其新版本中开始,所有更改都已包含在内。对于我的应用程序,第一种情况(从旧版本开始,接收更新通知)会更好,但我无法强制其中一种行为。这是它应该工作的吗?
非常感谢!
ios5 - 将 UIManagedDocument 从沙盒移动到 iCloud
我的总体问题是如何将现有的UIMangedDocument
(具有核心数据 sql 存储)从本地沙箱移动到 iCloud。
我在网上阅读的所有内容都在告诉我使用NSFileManager
's setUbiquitous:itemAtURL:destinationURL:error:
. 但是,当这样做时,我注意到它persistantStore
被复制到我认为是错误的云中。考虑到这个问题,我开始认为我应该在云中创建一个新文档,然后手动插入现有记录(因为沙箱中的现有数据库没有任何事务日志)。
那么,我的思路是正确的,还是将persistantStore
那里复制的内容用作起点(因此,如果连接了另一台设备,它将下载persistantStore
作为基础,然后应用之后发生的任何新事务)?
第二个相关问题(只是为了确认我对工作原理的理解UIManagedDocument
),如果我要创建一个文档(在云中),添加一条记录并更新同一记录 100,000 次,然后在新设备上打开此文档,会不会必须将 100,001 个事务应用到新数据库吗?似乎一个被大量使用的文档将继续消耗云上的空间,即使该文档具有最少的数据但有很多更新。
core-data - UIManagedDocument - 如何处理 UIDocumentStateSavingError?
我正在开发我的第一个 iCloud 应用程序。工作一段时间后,由于“UIDocumentStateSavingError”,应用程序无法再访问 UIManagedDocument。有没有办法真正找出发生了什么错误?
这是我创建 UIManagedDocument 的代码:
文档已经存在,因此在文档上调用了 openWithCompletionHandler:。这失败并且 UIDocumentStateChangedNotification 被触发,显示文档状态为 5: UIDocumentStateClosed 和 UIDocumentStateSavingError
在此之后,完成块被调用。从这里开始的正确方法是什么?有什么方法可以找出问题所在以及发生了什么样的错误?
我试图在完成块中重新打开文档,但结果是一样的。
我想我可以通过删除文件并重新创建它来解决问题。但是,一旦应用程序在商店中出现,这显然不是一个选择。我想知道出了什么问题,并为用户提供了一种处理问题的方法。
我已经在这里检查了处理 UIDocumentStateSavingError 的其他问题(其中不是很多),但似乎不适用于这里的问题。
知道如何找出问题所在吗?我不敢相信 API 会告诉你“保存过程中出了点问题,但我不会告诉你什么!”
core-data - 在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景
我在 iOS 5 中有一个目录应用程序,它从 XML 下载数据并UITableView
使用带有NSFetchedResultsController
. 数据存储在 Core Data 中UIManagedDocument
。因为我不想在下载和导入数据时阻塞主队列,所以我创建了一个用于下载数据的后台队列和一个新的子队列,NSManagedObjectContext
用于作为父NSPrivateQueueConcurrencyType
级导入数据。document.managedObjectContext
当我完成导入数据时,我-save:
在子上下文中进行了更改,并且更改会传播到父上下文。浏览目录时,我会在需要时导入其他数据。一切正常,直到UIManagedDocument
自动保存。
我已打开核心数据 SQL 调试,-com.apple.CoreData.SQLDebug 1
以查看文档何时自动保存。
在创建具有重复 ID 的文档的自动保存对象之后document.managedObjectContext
(我所有的实体 id 数据库都有唯一的 id 参数)。
我究竟做错了什么?
我创建了一个简单的示例代码来重现该问题。
这是代码:http
://dl.dropbox.com/u/20987346/ViewController.m
这是完整的 Xcode 项目:http ://dl.dropbox.com/u/20987346/CoreDataTest.zip
下面是在后台进行导入的方法。
该方法导入两个实体。获取具有指定 ID 属性的-entityWithID:
实体,如果它不存在,则使用NSEntityDescription -insertNewObjectForEntityForName:
. 转储所有实体以-dumpEntitiesInManagedObjectContext:
记录(一次在导入上下文中,一次在文档上下文中)。
问题是当文档被自动保存并完成一些额外的导入时,我在日志中得到以下内容:
导入上下文有 10 个实体,但主上下文有 11 个实体,ID 为 12 的实体是重复的。似乎旧对象没有在父上下文中修改,而是添加了。