核心数据的独特属性

rob*_*jam 35 iphone xcode cocoa-touch objective-c

是否可以使Core Data属性唯一,即没有两个MyEntity对象可以具有相同的myAttribute?

我知道如何以编程方式强制执行此操作,但我希望有一种方法可以使用xcode中的图形数据模型编辑器来实现.

我正在使用iPhone 3.1.2 SDK.

doo*_*Men 28

每次我在对象上创建时,我都会执行一个类方法,只有当另一个实体不存在时才会生成新实体.

+ (TZUser *)userWithUniqueUserId:(NSString *)uniqueUserId inManagedObjectContext:(NSManagedObjectContext *)context
{
    TZUser *user = nil;
    NSFetchRequest *request = [[NSFetchRequest alloc] init];

    request.entity = [NSEntityDescription entityForName:@"TZUser" inManagedObjectContext:context];
    request.predicate = [NSPredicate predicateWithFormat:@"objectId = %@", uniqueUserId];
    NSError *executeFetchError = nil;
    user = [[context executeFetchRequest:request error:&executeFetchError] lastObject];

    if (executeFetchError) {
         NSLog(@"[%@, %@] error looking up user with id: %i with error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [uniqueUserId intValue], [executeFetchError localizedDescription]);
    } else if (!user) {
        user = [NSEntityDescription insertNewObjectForEntityForName:@"TZUser" 
                                             inManagedObjectContext:context];
    }

    return user;
}
Run Code Online (Sandbox Code Playgroud)

  • 你基本上在每次INSERT之前执行SELECT.这不是太昂贵了吗? (12认同)
  • 这种方法的问题是你会产生 IO。如何避免这种情况? (2认同)

rob*_*jam 12

我已决定使用该validate<key>:error:方法检查是否已存在具有特定值的托管对象<key>.如果是这种情况,则会引发错误.

例如:

- (BOOL)validateMyAttribute:(id *)value error:(NSError **)error {
    // Return NO if there is already an object with a myAtribute of value
}

感谢Martin Cote的投入.

  • 执行 fetch 将更改托管对象上下文中的对象图 - 这不是您想要在验证方法中执行的操作! (2认同)

Rya*_*ner 9

从IOS 9开始,有一种新方法可以处理独特的约束.

您可以在数据模型中定义唯一属性.

您需要设置托管上下文合并策略"合并策略单例对象,定义在保存操作期间处理冲突的标准方法"NSErrorMergePolicy是默认值,如果存在任何合并冲突,此策略会导致保存失败.

- (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
  _managedObjectContext = [[NSManagedObjectContext alloc]    initWithConcurrencyType:NSMainQueueConcurrencyType];
  [_managedObjectContext setPersistentStoreCoordinator:coordinator];
  [_managedObjectContext setMergePolicy:NSOverwriteMergePolicy];
    return _managedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)

Apple Ducumentation合并政策中讨论了各种选项

Zachary Orr的回答很好地 回答了这个问题

他还亲切地创建了一个博客文章和示例代码.

示例代码

博客文章

最具挑战性的部分是使数据模型属性可编辑.在单击+符号添加约束后,单击左键然后单击鼠标右键.

在此输入图像描述