J'ai une entité dans les données de base qui a un attribut qui doit être unique. Il n'y a aucun moyen de définir cela dans l'interface visuelle. Je suppose que j'ai besoin de créer une classe personnalisée qui hérite de NsManageDObject, puis écrivez ma propre méthode de validation. P>
J'ai créé avec succès la classe personnalisée en sélectionnant les entités dans l'éditeur visuel et en choisissant le fichier Fichier -> Nouveau -> Nouveau fichier -> Sous-classe NsmanageDObject. J'utilise ceci pour ajouter des horodatages de création, donc je sais que ça fonctionne. P>
Mais maintenant quoi? Quelles méthodes ai-je besoin? P>
the NsmanagedObject Guide de référence me dit de "mettre en œuvre des méthodes du formulaire valider: Erreur:" mais ne fournit pas d'exemple. P>
Questions similaires ici et ici , mais j'ai besoin d'un peu plus d'aide. p>
Un exemple complet serait génial, mais toute aide est très appréciée. P>
3 Réponses :
Cela fait l'affaire, bien qu'il soit lent sur les inserts en vrac et vous devez toujours créer un objet 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; }
Selon la [validation d'objet gérée] de Apple [1], si vous souhaitez implémenter la logique en plus des contraintes que vous fournissez dans le modèle d'objet géré, vous ne devez pas remplacer ValidateValue: Forey: Erreur :. Au lieu de cela, vous devriez mettre en œuvre des méthodes du formulaire valider
Si vous utilisez validateValue mentionné ci-dessous effectuera le truc de validation (et le bon endroit pour effectuer la validation)
NsfetchedResultSluStroller code>, n'oubliez pas de supprimer l'objet de la mémoire pour éviter l'objet en double dans
utableview code> même sur une défaillance.
Quelque chose comme ceci: p>
Disons que vous avez une propriété de Validation de niveau de propriété : P> Si vous souhaitez implémenter la logique en plus des contraintes que vous fournissez dans le modèle d'objet géré, vous ne devez pas remplacer où foo code> que vous souhaitez valider
validateValue: Forey: Erreur: code>. Au lieu de cela, vous devez implémenter des méthodes du formulaire
valider
[Self isunique] n'existe pas,
Vous êtes correct, Isunique serait votre propre méthode de détermination de la ness unique.
Avez-vous essayé l'une des solutions dans la réponse qu'ils vous ont donné? Fondamentalement, vérifiez l'unicité avant d'appeler Enregistrer. Le code dans le deuxième exemple devrait être tout ce dont vous avez besoin.
@sosborn Les exemples ne montrent que comment la validation elle-même fonctionne (itérale sur tous les enregistrements précédents à la recherche de la même valeur), mais pas de l'endroit où le mettre.
Il suffit de faire une méthode qui retourne un bool. Si c'est un retour unique Oui, sinon retourner non. Appelez cette méthode. Si elle renvoie oui, faites la sauvegarde, si elle renvoie non, ne faites pas la sauvegarde.
@sosborn d'où puis-je l'appeler? De "ValidateValue: Forey: Erreur:"?