在我的CoreData对象中,我有一个name属性,只是一个字符串。是否有任何自动方法或框可以勾选以阻止用户保存具有相同“名称”属性的两个对象?或者我可以手动检查一下吗?
感谢。
答案 0 :(得分:3)
使用key value validation(KVV)。在您的实体类中添加-validateName:error:
方法。在该方法中,您可以对具有相同名称的对象执行提取。如果找到任何,则输入的名称在数据存储中不是唯一的,因此返回错误。
答案 1 :(得分:2)
不幸的是,您没有任何复选框或自动系统来防止Core数据中出现重复数据。所以你必须自己照顾它..它很容易实现。
您必须使用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];
}