gpt4 book ai didi

ios - 一个或多个 UIManagedDocuments

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:08:55 26 4
gpt4 key购买 nike

好吧,假设我正在制作一个观鸟应用。

有一个“官方”鸟类数据库。它存储在一个 UIManagedDocument 中。它用于将所有鸟类填充到 UITableView 中,并使用图片和数据为每只鸟类提供详细的 View 。这个数据库将在未来升级更多的鸟类。

然后用户就可以去郊外拍鸟了。他将它们添加到应用程序的另一个部分,称为“日记”,当他识别出这只鸟时,他将其与一只“官方”鸟联系起来。此信息(所有用户收集的数据)应使用 iCloud 进行备份。它还用于填充日记的 UITableView 和详细 View 。

从日记的详细 View ,您可以转到“官方”鸟的详细 View 。从该 View 中,您可以转到一个列表,其中包含用户日记中该鸟的所有记录。

问题是:我应该为每个用户条目使用一个 UIManagedDocument 吗?这如何与带有缩略图的 UITableView 一起使用?

最佳答案

UIDocument 是物理文件包装器的管理类。 UIManagedDocument 是提供 CoreData 堆栈的子类。

A File Wrapper只不过是文件夹或文件的抽象。对于 UIManagedDocument,该文件夹包含 CoreData 堆栈连接到的 SQLite 数据库。

您不会为日记条目使用单独的文档,就像您不会为每个写作段落使用单独的 Word 文档一样。

由于您的应用听起来更像是 Apple 所说的“鞋盒应用”,其中一个用户拥有一堆数据,他们可以在其中添加和减去这些数据,所以没有必要使用文档架构。然而,说这个 UIManagedDocument 为您提供了一个免费的堆栈,因此可能会很有用。

如果是我构建这个应用程序,我可能会采用这种方法。

  1. 官方鸟类的只读数据库。该数据库在首次启动时以及需要更新时下载。你不应该试图把它放在你的包里,因为它会很大。它不会在任何时候备份。

  2. 保存您的日记条目的读写数据库。此数据库已备份到 iCloud,并且不会在 Bird 数据库的升级过程中受到影响。

  3. 使用 GUID 而不是 CoreData 关系将两个数据库松散地耦合在一起。

enter image description here

例如,野鸭的 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
  • 的 Controller
  • NSManagedObjectContext - 模型工作区,像一张便条纸。使用并保存或使用并丢弃。

在这个阶段不要被 UIManagedDocument 束缚。它是文件系统的 Controller ,顶部有一个 CoreData 堆栈。它不会立即执行您想要执行的操作。

担心真正的问题是如何加载这两个数据库并使用它们的数据来驱动您的 UI。

如果以后真的很重要,您可以移动基于 UIManagedDocument 的架构。如果这是我的应用程序,我不会打扰。

关于ios - 一个或多个 UIManagedDocuments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com