iOS CoreData mise à jour de l'entité objet

Je me suis mise en œuvre d'une voiture gestionnaire pour une application iPhone et j'ai de la difficulté à épargner une nouvelle voiture. J'ai donc une "Voiture" de l'entité (et par-chargé DB), contenant de nombreux attributs. J'ai 2 booléens "sauvé" et de "sélection" pour la piste de la voiture de l'utilisateur ajouté à sa liste (si elle est ajoutée, enregistré = 1) et la voiture est actuellement sélectionné. Donc quand je crée une nouvelle voiture, je désélectionner l'ancien (selected=0) et que vous souhaitez modifier votre nouvelle voiture pour définir ses attributs enregistrés=1 et sélectionné=1.

Voici mes fonctions:

- (IBAction)save
{
//Disable the previous car selection.
[self deselectCurrentSelectedCar];
//Add new car as saved and selected.
[self saveAndSelectNewCar];
//Call the delegate to dismiss the modal view.
[_delegate dismissAndSave];
}
- (void)deselectCurrentSelectedCar
{    
//Fetched saved car.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
//Set predicate and sort orderings...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = 1"];
[fetchRequest setPredicate:predicate];
//Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
if (mutableFetchResults == nil) {
//Handle the error.
NSLog(@"[AddCarViewController] deselect car: car not found.");
}
else {
//Get car and assign new selected value.
Car *carToSave = (Car *)[mutableFetchResults objectAtIndex:0];
[carToSave setSelected:[NSNumber numberWithInt:0]];
//Save the car.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
//Handle the error.
NSLog(@"[AddCarViewController] deselect car: error saving car.");
}
else {
NSLog(@"[AddCarViewController] deselect car: car saved.");
}
}
//Memory management.
[fetchRequest release];
[mutableFetchResults release];
}
- (void)saveAndSelectNewCar
{
//Get the car, and pass to the delegate the new settings.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
//Set predicate and sort orderings...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(year=%@) AND (make=%@) AND (model=%@) AND (d=%@) AND (n=%@)", _car.year, _car.make, _car.model, _car.d, _car.n];
[fetchRequest setPredicate:predicate];
//Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
if (mutableFetchResults == nil) {
//Handle error.
NSLog(@"[AddCarViewController] save and select: can't save the new car");
}
else {
//Get the car selected.
Car *selectedCar = (Car *)[mutableFetchResults objectAtIndex:0];
[selectedCar setValue:[NSNumber numberWithInt:1] forKey:@"selected"];
[selectedCar setValue:[NSNumber numberWithInt:1] forKey:@"saved"];
//Save the car.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
//Handle the error.
NSLog(@"[AddCarViewController] save and select: error saving car.");
}
else {
NSLog(@"[AddCarViewController] save and select: car saved.");
}
//Add car to delegate.
[EcoAppAppDelegate setUserCar:selectedCar];
}
//Memory management.
[fetchRequest release];
[mutableFetchResults release];
}

Et j'ai ce journal le temps: "erreur lors de l'enregistrement de la voiture." sur les deux fonctions. Donc, il ya certainement quelque chose de mal.

Aussi, c'est assez souvent embêtant pour aller chercher la voiture que je veux modifier, au lieu de le faire tout de suite une mise à jour. Si il y a un autre merci de me le dire!

Grâce.

Quelle est l'erreur? Peut-être que ce serait aider?
erreur lors de l'exécution de SQL : contrainte échoué
Vous avez besoin de fournir plus d'informations. Vous avez deux NSLog déclarations print "erreur lors de l'enregistrement de la voiture". Lequel êtes-vous l'erreur? Et quand cela arrive, ce qui ne l'NSError paramètre ont à dire à ce sujet? Ce paramètre est-il alors de Base de Données peut vous dire ce qui s'est passé, c'est la première chose que vous devriez regarder.
J'ai donc essayé différentes, et c'est ce qui s'est passé: quand j'ai nettoyer mon projet et supprimer l'application dans le simulateur (ou périphérique), la première fois que je suis en ajoutant une voiture, il fonctionne. Alors, ça ne fonctionne jamais... Pour le message d'erreur Error Domain=NSCocoaErrorDomain Code=256 "The operation couldn’t be completed. (Cocoa error 256.)" UserInfo=0x5aae300 {NSFilePath=/Users/andregueziec/Library/Application Support/iPhone Simulator/4.3.2/Applications/861C4DD9-D9BC-4438-A3D4-BA69AA0664B5/Documents/EcoApp.sqlite, NSUnderlyingException=error during SQL execution : constraint failed} mais erreur 256 n'est pas explicite.
Peut-être que votre prédicat doit lire: [NSPredicate predicateWithFormat: @"selected == 1"]?

OriginalL'auteur Dachmt | 2011-05-27