如何在Core Data中进行自定义验证(为了唯一性)?

Sjo*_*ost 8 validation core-data ios

我在Core Data中有一个实体,它有一个需要唯一的属性.没有办法在可视化界面中设置它.我假设我需要创建一个继承自NSManagedObject的自定义类,然后编写自己的验证方法.

我通过在可视化编辑器中选择实体并选择文件 - >新建 - >新建文件 - > NSManagedObject子类,成功创建了自定义类.我用它来添加创建时间戳,所以我知道它有效.

但现在呢?我需要哪些方法?

NSManagedObject参考指南告诉我"实现形式验证的方法:错误:"但没有提供一个例子.

类似的问题在这里这里,但我需要更多的帮助.

一个完整的例子很棒,但是非常感谢任何帮助.

que*_*ish 6

假设您有一个foo要验证的属性

来自物业级验证:

如果除了在托管对象模型中提供的约束之外还要实现逻辑,则不应覆盖validateValue:forKey:error:.相反,您应该实现表单的方法validate<Key>:error:.

<Key>你的财产在哪里?你实际上会实现类似的东西:

-(BOOL)validateFoo:(id *)ioValue error:(NSError **)outError {
    return [self isUnique];
}
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,isUnique将是你自己确定唯一性的方法. (3认同)

Sjo*_*ost 1

这确实有效,尽管批量插入速度很慢并且您仍然需要创建一个 NSError 对象。

-(BOOL)validateValue:(__autoreleasing id *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error {
    [super validateValue:value forKey:key error:error];

    // Validate uniqueness of my_unique_id
    if([key isEqualToString:@"my_unique_id"]) {
        NSFetchRequest * fetch = [[NSFetchRequest alloc] init];
        [fetch setEntity:[NSEntityDescription entityForName:[self.entity name]
               inManagedObjectContext:self.managedObjectContext]];

        NSPredicate *predicate = [NSPredicate 
            predicateWithFormat:@"my_unique_id = %@",[self valueForKey:key]];

        fetch.predicate = predicate;

        NSError *error = nil;
        NSUInteger count = [self.managedObjectContext 
                           countForFetchRequest:fetch error:&error];

        if (count > 1) {
            // Produce error message...

            // Failed validation:
            return NO;
        }


    }

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

  • 根据Apple的[托管对象验证][1],如果您想在托管对象模型中提供的约束之外实现逻辑,则不应覆盖validateValue:forKey:error:。相反,您应该实现 validate&lt;Key&gt;:error: 形式的方法。在您的情况下,这是 validateMy_unique_id:error: 方法。[1]:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdValidation.html (5认同)