- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好吧,假设我正在制作一个观鸟应用。
有一个“官方”鸟类数据库。它存储在一个 UIManagedDocument
中。它用于将所有鸟类填充到 UITableView
中,并使用图片和数据为每只鸟类提供详细的 View 。这个数据库将在未来升级更多的鸟类。
然后用户就可以去郊外拍鸟了。他将它们添加到应用程序的另一个部分,称为“日记”,当他识别出这只鸟时,他将其与一只“官方”鸟联系起来。此信息(所有用户收集的数据)应使用 iCloud 进行备份。它还用于填充日记的 UITableView
和详细 View 。
从日记的详细 View ,您可以转到“官方”鸟的详细 View 。从该 View 中,您可以转到一个列表,其中包含用户日记中该鸟的所有记录。
问题是:我应该为每个用户条目使用一个 UIManagedDocument
吗?这如何与带有缩略图的 UITableView
一起使用?
最佳答案
UIDocument
是物理文件包装器的管理类。 UIManagedDocument
是提供 CoreData 堆栈的子类。
A File Wrapper只不过是文件夹或文件的抽象。对于 UIManagedDocument
,该文件夹包含 CoreData 堆栈连接到的 SQLite 数据库。
您不会为日记条目使用单独的文档,就像您不会为每个写作段落使用单独的 Word 文档一样。
由于您的应用听起来更像是 Apple 所说的“鞋盒应用”,其中一个用户拥有一堆数据,他们可以在其中添加和减去这些数据,所以没有必要使用文档架构。然而,说这个 UIManagedDocument
为您提供了一个免费的堆栈,因此可能会很有用。
如果是我构建这个应用程序,我可能会采用这种方法。
官方鸟类的只读数据库。该数据库在首次启动时以及需要更新时下载。你不应该试图把它放在你的包里,因为它会很大。它不会在任何时候备份。
保存您的日记条目的读写数据库。此数据库已备份到 iCloud,并且不会在 Bird 数据库的升级过程中受到影响。
使用 GUID 而不是 CoreData 关系将两个数据库松散地耦合在一起。
例如,野鸭的 GUID 可能是 DUCK1234
。将该 GUID 作为属性(例如 birdGUID )写在您的日记条目中。要查找野鸭的所有日记条目,请在您的日记数据库中对“birdGUID == 'DUCK1234'”运行查询,并且您会得到所有发现的次数。
这样做的原因是您可以升级官方鸟类数据库而不用担心损害用户数据。假设您购买了一个更好/更便宜的数据库或另一个有鸟叫声的数据库,您可以调整模式来应对这种情况。
编辑
一种方法(一种简单的方法)是使用两个 NSPersistentStores
构建您的堆栈
NSPersistentStoreCoordinator *myPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
NSDictionary *readonly_options = @{NSReadOnlyPersistentStoreOption:@YES};
[myPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:officialBirdStoreURL options:readonly_options error:&error];
NSDictionary *readwrite_opts = @{NSMigratePersistentStoresAutomaticallyOption:@YES,
NSInferMappingModelAutomaticallyOption:@YES};
[myPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:diaryStoreURL options:readwrite_opts error:&error];
NSManagedObjectContext *workingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];
workingContext.persistentStoreCoordinator = myPersistentStoreCoordinator;
我不打算完全解释这个,因为有很多 excellent Core Data tutorials但请注意在您的鸟类数据库上设置 NSReadOnlyPersistentStoreOption
。
这不涉及使用 UIManagedDocument
,因为您没有对堆栈进行足够的控制。
总而言之,堆栈从下到上。
UIManagedDocument
- 模型 Controller 。处理文件包装器力学并提供免费堆栈。不需要。可能使多文档应用程序更容易(或不更容易)。NSManagedObjectModel
- 模型,核心数据的架构模型。 NSPersistentStore
- 模型,代表单个 SQLite 数据库磁盘。 NSPersistentStoreCoordinator
- 任意数量的 NSPersistentStore
NSManagedObjectContext
- 模型工作区,像一张便条纸。使用并保存或使用并丢弃。在这个阶段不要被 UIManagedDocument
束缚。它是文件系统的 Controller ,顶部有一个 CoreData 堆栈。它不会立即执行您想要执行的操作。
担心真正的问题是如何加载这两个数据库并使用它们的数据来驱动您的 UI。
如果以后真的很重要,您可以移动基于 UIManagedDocument 的架构。如果这是我的应用程序,我不会打扰。
关于ios - 一个或多个 UIManagedDocuments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713289/
我一直在阅读苹果文档,但仍然有一个问题,我找不到答案。我有一个 UIManagedDocument 对象,它有两个嵌套上下文 - 主线程上的子上下文和私有(private)线程上的父上下文。接下来,我
我已经看过 How do I create a global UIManagedDocument instance per document-on-disk shared by my whole ap
在UIManagedDocument的文档中简要提到了以下内容: 为了支持异步数据写入,Core Data实际上使用一对嵌套的托管对象上下文。 是特定于UIManagedDocument还是Core
所以我将核心数据迁移到UIManagedDocument。 在iPhone模拟器上调用openWithCompletionHandler可以正常工作,但是当我尝试在真实设备上运行项目时,它始终返回NO
我有一个连接到 NSFetchedResultsController 的 TableView ,相应的 managedObjectContext 是 self.myDatabase.managedOb
好吧,假设我正在制作一个观鸟应用。 有一个“官方”鸟类数据库。它存储在一个 UIManagedDocument 中。它用于将所有鸟类填充到 UITableView 中,并使用图片和数据为每只鸟类提供详
我正在尝试使用 Core Data 制作一个 iPhone 应用程序。我必须使用 NSManagedObjectContext 来访问数据,为此我使用了 UIManagedDocument。但是,如果
我的应用使用核心数据 SQLite 数据库。我想让我的用户使用 iCloud 在设备之间同步它 - 我想我可以使用 UIManagedDocument。 我按照 Apple 的文档对其进行了子类化,并
我正在使用这个博客:http://www.adevelopingstory.com/blog/2012/03/core-data-with-a-single-shared-uimanageddocum
我找到了这些斯坦福教程 https://itunes.apple.com/us/course/ipad-iphone-app-development/id495052415 ,一直在听有关核心数据的讲
我正在开发一个使用 UIManagedDocument 子类的 iPhone 应用程序并将其文档存储在 iCloud 上。 一切正常,直到我更改了我的核心数据模型/方案(添加了一个新的模型版本 - 就
首先,我应该提到这是我在这个网站上的第一篇文章。我正在尝试自学 iOS 编程,在谷歌搜索答案时,我发现我经常被引导到这里。所以感谢所有在这里做出贡献的人。你已经帮了我很多了。 我一直在参加斯坦福大学
在斯坦福大学 CS193P 类(class)中,我开始在我的应用程序中使用 CoreData,该类(class)涉及 iOS 5 新类 UIManagedDocument 的使用。该方法本身非常简单,
我的应用程序中有一项功能,用户可以通过单击按钮重置应用程序上的所有内容。此时,我没有尝试删除所有核心数据关系(级联删除)和其他并发症,而是决定使用这段代码实际删除整个 UIManagedDocumen
我设置了异常断点,当我调用时- (void)saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation
我正在使用 UIManagedDocument 读取和写入 CoreData。我有 Document 类。这是一些教程中的文档: .h #import #import typedef void (
最近,我在 iOS 中使用一个时间表应用程序,我在使用 Core Data 时遇到了问题。 我的应用程序有一个主用户界面,有点像 Apple 创建的原始日历应用程序,我将所有事件数据保存在 Core
我在使用 UIManagedDocument 保存实体时遇到问题。我有一个 NSFetchedResultsController,其上下文设置为 UIManagedDocuments 上下文。我在 C
如标题中所述,我想同步打开 UIManagedDocument,即,我希望我的执行等到打开完成。我仅在 mainThread 上打开文档。 当前要打开的 API 使用 block [UIManaged
我一直在关注 CS193p 关于核心数据的讲座,但在插入新的托管对象时遇到了问题。 错误是: Terminating app due to uncaught exception 'NSInternal
我是一名优秀的程序员,十分优秀!