ios - iOS 7 的核心数据、iCloud 和预构建数据

标签 ios core-data icloud

我处在一个非常普遍的情况下,主要是由于缺乏经验......

我的应用程序在第一次启动时在数据库中插入预建数据。 我只是检查设备中是否存在数据库...如果它不存在,这是第一次启动,所以我在创建数据库后添加我的预构建数据。

在开发结束时我决定激活 iCloud,哇!只需一行代码即可使其工作......我在不同的设备上尝试过,我的预建数据显然是重复的:(

我了解到管理预建数据的更好方法是使用多个持久存储,为预建数据创建只读存储(我的预建数据不需要由用户,所以只读解决方案就可以了)。

问题是我在用户插入的数据之间存在关系,因此我无法处理多个持久存储(核心数据不支持不同存储之间的关系)。

我查看了 Fetched Properties,但它似乎需要对我的代码进行 super 大刀阔斧的修改。

我想去重复数据......所以只删除数据库中已经存在的数据,我怀疑这个过程对关系来说真的很危险,我怎么能删除只是重复的对象第一次发布时创建的“原始”?=

鉴于用户无法修改或删除我的预构建数据,您认为这是解决此问题的最佳方法?

//编辑:关于模型的一些信息:

用户正在处理的实体(添加/编辑/修改)代表一个任务。 该实体有一个名称和一个类别。

CATEGORY 是我预先构建的实体。

所以用户为任务添加一个名称并从预建数据中选择一个类别。

最佳答案

在您的 Category 实体中,在 PrebuiltData 模型中,创建一个“id”属性(并确保它在各个版本之间保持一致)此模型不应由 iCloud 管理。

在您的 Task 实体中,在 UserData 模型中,创建一个“categoryId”属性。这种模式应该由iCloud来管理(否则讨论毫无意义)

现在您可以在类别实体上创建一个方法来获取类别中的所有任务,使用:

-(NSArray*)tasks
{
    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Task"];
    request.predicate = [NSPredicate predicateWithFormat:@"id = %@", self.id];
    return [gTaskManagedObjectContext executeFetchRequest:request error:NULL];
}

同样,您可以在任务实体上创建一个方法来获取类别:

-(Category*)category
{
    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Category"];
    request.predicate = [NSPredicate predicateWithFormat:@"id = %@", self.categoryId];
    NSArray*        results = [gTaskManagedObjectContext executeFetchRequest:request error:NULL];

    return results.count > 0 ? results[0] : nil;
}

关于ios - iOS 7 的核心数据、iCloud 和预构建数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22488789/

相关文章:

ios - 应用程序加载器警告 : The app references non-public selectors in Payload/<Appname>. app/<应用程序名称>:id

ios - 在 Xcode UI 测试中等待 30 秒

ios 10 推送通知媒体附件随机不起作用

objective-c - 如何像 "filteredArrayUsingPredicate"那样过滤NSFetchedResultsController

ios - 如何按修改日期对 UIDocument 的 icloud NSMetadataQuery 结果进行排序?

ios - 删除iCloud容器内容

ios - Xcode 7.1 : Failed to build project <Project Name> for scheme

ios - NSManagedObject 作为 MKAnnotation 和核心数据并发

swift - 核心数据通用获取请求

ipad - iPad 上显示的 UIDocumentMenuViewController 给出 "Unable to simultaneously satisfy constraints"