仅允许给定Core Data Entity的一个实例

时间:2011-03-26 23:43:29

标签: objective-c cocoa core-data

在不违反设计原则的情况下,最好的方法是什么?

一个例子是在awakeFromInsert中获取该实体的所有先前实例,然后在找到某些内容时抛出异常(或任何想要做的事情)。但这种方式很糟糕,因为在模型对象中访问MOC肯定不好。

2 个答案:

答案 0 :(得分:2)

您无法在Core Data对象图上实际强制执行单例模式。您可以尝试限制另一个实例的插入,但这很麻烦。

根据我的经验,您需要单个管理对象的信念表明设计不佳。单身人士用于控制程序内部。核心数据对象应该代表真实世界的对象,事件或条件和现实世界的对象,事件和条件不会显示为单例或类似的东西。

您可能正在尝试将控制器甚至视图逻辑放入数据模型中。您可能想重新考虑数据模型。

答案 1 :(得分:0)

我知道这是一个旧线程,但实际上我遇到了一个我希望保存实体的单个实例的实例。下面是一些示例代码,可以帮助其他人解决这个问题。

我的解决方案是清除实体(配置文件),将同一实体保存到Core Data,如果它有> = 1实例:

- (IBAction)saveProfile:(id)sender {

    NSManagedObjectContext *context = [self managedObjectContext];

    if ([self.profile count] >= 1) {

        NSFetchRequest * allCars = [[NSFetchRequest alloc] init];
        [allCars setEntity:[NSEntityDescription entityForName:@"Profile" inManagedObjectContext:context]];
        [allCars setIncludesPropertyValues:NO];

        NSError * error = nil;
        NSArray * cars = [context executeFetchRequest:allCars error:&error];

        for (NSManagedObject * car in cars) {
            [context deleteObject:car];
        }

        NSError *saveError = nil;
        [context save:&saveError];

    }

    // Create a new managed object
    NSManagedObject *profile = [NSEntityDescription insertNewObjectForEntityForName:@"Profile" inManagedObjectContext:context];

    // Code to save information to persistent data store

}

正如预期的那样,在viewDidLoad中,我拉出实体的(配置文件)信息并填充视图,如果profile == 1 instance:

if ([self.profile count] == 1) {
   // Code to pull information from persistent data store and populate the view
}