iOS 7的核心数据,iCloud和预建数据

时间:2014-03-18 19:08:50

标签: ios core-data icloud

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

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

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

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

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

我看了一下Fetched Properties,但似乎需要对我的代码进行超级强烈的编辑。

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

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

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

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

CATEGORY是我预先构建的实体。

因此,用户为任务添加名称,并从预建数据中选择一个CATEGORY。

1 个答案:

答案 0 :(得分:1)

在您的类别实体中,在PrebuiltData模型中,创建一个“id”属性(并确保从版本到版本一致)此模型不应由iCloud管理。

在Task实体的UserData模型中,创建“categoryId”属性。这个模型应该由iCloud管理(或者这个讨论毫无意义)

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

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

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

-(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;
}