4

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

谢谢。

4

2 回答 2

3

使用键值验证(KVV)。-validateName:error:向您的实体类添加一个方法。在该方法中,您可以对具有相同名称的对象执行提取。如果找到,则输入的名称在数据存储中将不是唯一的,因此返回错误。

于 2012-04-05T22:09:01.027 回答
2

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

您必须使用NSPredicate组合fetchedResultsController来执行搜索是否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

于 2012-04-05T21:55:16.277 回答