2009-10-08 6 views
0

Je me demande comment je pourrais supprimer un objet en fonction de son titre pour la propriété CoreName 'nom' que j'ai. Pour ajouter un objet que j'utilise ce code:Supprimer un objet avec un certain titre d'un NSTreeController

NSManagedObjectContext *moc = [self managedObjectContext]; 
JGManagedObject *theParent = 
    [NSEntityDescription insertNewObjectForEntityForName:@"projects" 
            inManagedObjectContext:moc]; 
[theParent setValue:nil forKey:@"parent"]; 
// This is where you add the title from the string array 
[theParent setValue:@"myTitle" forKey:@"name"]; 
[theParent setValue:[NSNumber numberWithInt:0] forKey:@"position"]; 

Mais je ne peux pas sembler trouver une fonction équivalente à supprimer un objet.

Répondre

0

Je ne sais pas si vous avez regardé dans le guide de programmation des données de base dans la section pour les objets adding and deleting.

Modifier

J'ai modifié cette option pour supprimer à partir d'un tableau de noms. Encore; moins de 5 minutes de travail avec le Predicate Programming Guide.

- (void)removeObjectsWithNames:(NSArray *)nameArray { 
    // Get the moc and prepare a fetch request for the required entity 
    NSManagedObjectContext *moc = [self managedObjectContext]; 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:moc]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 

    // Create a predicate for an array of names. 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN %@", nameArray]; 
    [request setPredicate:predicate]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

    // Execute the fetch request put the results into array 
    NSError *error = nil; 
    NSArray *resultArray = [moc executeFetchRequest:request error:&error]; 
    if (resultArray == nil) 
    { 
     // Diagnostic error handling 
     NSAlert *anAlert = [NSAlert alertWithError:error]; 
     [anAlert runModal]; 
    } 

    // Enumerate through the array deleting each object. 
    // WARNING, this will delete everything in the array, so you may want to put more checks in before doing this. 
    For (JGManagedObject *objectToDelete in resultArray) { 
     // Delete the object. 
     [moc deleteObject:objectToDelete]; 
    } 
} 

Edité 10/10/2009 - Pour ajouter ce que Joshua a essayé.

for(NSString *title in oldTasks) { // 1 
    // Get the moc and prepare a fetch request for the required entity 
    NSManagedObjectContext *moc = [self managedObjectContext]; 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"projects" inManagedObjectContext:moc]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 

    // Create a predicate for an array of names. 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title IN %d", oldTasks]; // 2 
    [request setPredicate:predicate]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

    // Execute the fetch request put the results into array 
    NSError *error = nil; 
    NSArray *resultArray = [moc executeFetchRequest:request error:&error]; 
    if (resultArray == nil) 
    { 
     // Diagnostic error handling 
     NSAlert *anAlert = [NSAlert alertWithError:error]; 
     [anAlert runModal]; 
    } 

    JGManagedObject *objectToDelete = [resultArray objectAtIndex:0]; 
    // Delete the object. 
    [moc deleteObject:objectToDelete]; 
} 

Remarques

Je l'ai mis en évidence deux lignes.

  1. Vous avez collé mon exemple en tant que boucle for plutôt qu'un appel de fonction. C'est juste enlever les ficelles une à la fois et les passer dans la méthode. Dans mon exemple, je passe dans un tableau de chaînes que vous voulez faire correspondre.

  2. C'est là que vous rencontrez votre problème. Si vous avez pris la peine de lire le Guide de programmation des prédicats, tout en haut, dans la section Bases des prédicats, il indique qu'il s'attend à ce que la classe avec laquelle il est utilisé soit conforme à la norme KVC. C'est pourquoi vous obtenez l'erreur sur la conformité KVC. Vous essayez de rechercher le titre IN ... mais le titre n'est pas une propriété de votre modèle.

Je pense que vous pouvez être confus au sujet de ce que fait un prédicat. Regardez le code d'exaple que j'ai écrit.

Premièrement, je crée une requête Fetch qui sélectionne les objets de l'entité 'Projects'.

En second lieu, je crée un prédicat qui dit pour chaque objet retourné par la demande de récupération, obtenir la valeur du « nom » la propriété et la comparer aux valeurs des objets dans le « tabNoms »

En troisième lieu, Je crée un descripteur de tri qui triera les résultats par ordre croissant en fonction de la propriété 'name'.

Ensuite, une fois que j'ai défini cette requête d'extraction, je l'exécute sur le moc et renvoie un tableau d'objets correspondant à ces critères.

+0

Merci, c'est exactement ce que je cherche. J'essaie de supprimer plus d'un objet, comme vous l'avez dit, ce sera un peu plus difficile. Où pourrais-je commencer avec ça? – Joshua

+0

Ah, Ok, ça aide. C'est le code que j'utilise http://grab.by/8He. Il boucle à travers un tableau de chaînes et en espérant supprimer les objets qui ont un titre correspondant à tout dans le tableau. Mais il semble jeter un tas d'erreurs, http://grab.by/8Hf, http://grab.by/8Hg. Il dit que la classe n'est pas conforme à la norme KVC. Mais je ne sais pas de quoi il parle. – Joshua

+0

@Joshua: Ces captures d'écran vont disparaître dans une semaine, ce qui ne le rendra pas utile pour quelqu'un d'autre qui a le même problème. Tout d'abord, vous avez copié et collé ma définition de méthode en tant que boucle for. Deuxièmement, ce n'est pas une charge d'erreurs, c'est la pile d'appels pour l'erreur unique qui vous montre les appels de méthode qui mènent au problème. Troisièmement; vous essayez de créer un prédicat basé sur le titre de propriété, qui n'existe pas dans votre modèle. – Abizern

Questions connexes