2012-04-05 93 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