核心数据唯一属性

问题描述 投票:37回答:7

是否有可能使核心数据属性唯一,即没有两个MyEntity对象可以具有相同的myAttribute?

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

我正在使用iPhone 3.1.2 SDK。

objective-c iphone cocoa-touch xcode
7个回答
29
投票

每次我在对象上创建时,我都会执行一个类方法,该方法仅在不存在另一个实体时才创建一个新实体。

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

12
投票

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

例如:

-(BOOL)validateMyAttribute:(id *)value error:(NSError **)error {//如果已经存在具有myAtribute值的对象,则返回NO}

感谢Martin Cote的投入。


10
投票

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

Apple Ducumentation Merge Policy讨论了各种选项

这里回答很好Zachary Orr's Answer

而且他还创建了一个博客文章和示例代码。

Sample Code

Blog Post

[最具挑战性的部分是使数据模型属性可编辑。秘密是单击+号添加约束后,先单击鼠标然后单击鼠标右键。

enter image description here


3
投票

您可以重写setMyAttribute方法(使用类别),并确保在那里具有唯一性,尽管这可能很昂贵:


0
投票

我真的很喜欢@DoozMen方法!!我认为这是做我需要做的最简单的方法。


0
投票

查看Apple documentation以进行属性间验证。它描述了如何在可以查询整个数据库的同时验证特定的插入或更新操作。


0
投票

您只需要检查一个现有的:/

© www.soinside.com 2019 - 2024. All rights reserved.