2012-04-05 60 views
4

在我的CoreData对象中,我有一个名称属性,只是一个字符串。是否有任何自动方法或框可以打勾以阻止用户保存具有相同“名称”属性的两个对象?或者我应该手动检查这个?CoreData中的重复名称?

谢谢。

回答

3

使用key value validation(KVV)。将-validateName:error:方法添加到实体的类中。在该方法中,您可以为具有相同名称的对象执行提取操作。如果找到任何内容,则输入的名称在数据存储区中将不唯一,因此返回错误。

+0

感谢您的链接。学到了新东西。 – 2012-04-06 04:42:21

2

不幸的是,您没有任何复选框或自动化系统来防止Core数据中的重复数据。所以你必须自己照顾它..它很容易实现。

您必须使用NSPredicatefetchedResultsController结合来执行搜索,以确定name是否已经存在。如果您输入的name已经存在,那么您的fetchedResultsController.fetchedObjects计数将大于零,因此您不允许重复输入。如果找不到重复的条目fetchedResultsController.fetchedObjects是< 1,那么您将允许条目。尝试代码是这样的:

- (IBAction)saveName 
    { 
    NSLog(@"saveArtistInformation"); 
    NSError *error = nil; 

    // We use an NSPredicate combined with the fetchedResultsController to perform the search 
if (self.nameText.text !=nil) 
{ 
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"name contains[cd] %@", self.nameText.text]; 
    [fetchedResultsController.fetchRequest setPredicate:predicate]; 
} 

if (![[self fetchedResultsController] performFetch:&error]) 
{ 
    // Handle error 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    exit(-1); // Fail 
} 

// compare `fetchedResultsController`'s count if its <1 allow insertion 

if ([fetchedResultsController.fetchedObjects count] < 1) 
{ 
    NSLog(@"Found that Artist already in Core Data"); 
    Entity *entity = (Entity *)[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:self.managedObjectContext]; 
    entity.name = self.nameText.text; 

    //call save method 

    if (![managedObjectContext save:&error]) 
    { 
     NSLog(@"Problem saving: %@", [error localizedDescription]); 
    } 
} 
else 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Name already exists" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
    [alert show]; 
    [alert release]; 
} 

礼貌:TheAppCodeBlog