8
votes

Comment faire une validation personnalisée (pour l'unicité) dans les données de base?

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.

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.

Mais maintenant quoi? Quelles méthodes ai-je besoin?

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.

Questions similaires ici et ici , mais j'ai besoin d'un peu plus d'aide.

Un exemple complet serait génial, mais toute aide est très appréciée.


4 commentaires

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:"?


3 Réponses :


1
votes

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;
}


1 commentaires

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 : erreur :. Dans votre cas, c'est validatemy_unique_id: erreur: méthode. [1]: développeur.apple.com/ Bibliothèque / Mac / Documentation / Cocoa / Conceptu Al / ...



2
votes

validateValue mentionné ci-dessous effectuera le truc de validation (et le bon endroit pour effectuer la validation)

Si vous utilisez NsfetchedResultSluStroller , n'oubliez pas de supprimer l'objet de la mémoire pour éviter l'objet en double dans utableview même sur une défaillance. Quelque chose comme ceci: xxx


0 commentaires

6
votes

Disons que vous avez une propriété foo que vous souhaitez valider

de Validation de niveau de propriété :

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 devez implémenter des méthodes du formulaire valider : erreur: .

est votre propriété. Vous feriez réellement implémenter quelque chose comme: xxx


2 commentaires

[Self isunique] n'existe pas,


Vous êtes correct, Isunique serait votre propre méthode de détermination de la ness unique.