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.
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
Vous devez vous connecter pour publier un commentaire.
Dans votre fichier d'en-tête, vous devez mettre en place une mutable tableau pour vos voitures.
et
Alors assurez-vous de faire la synthèse, dans votre fichier de mise en oeuvre. Ensuite, lorsque vous récupérer à partir de votre géré contexte de l'objet, vous pouvez définir votre tableau avec le contenu renvoyé
Le faire tenir sur tous les objets dans votre géré contexte de l'objet, de sorte que lorsque vous voulez modifier une Voiture, vous pouvez le trouver là, au lieu de chercher à nouveau. Si vous avez besoin de faire le tri, vous pouvez appliquer un tri descripteur initialisé avec l'un de vos attributs comme une clé. Par exemple:
Cela permettra de trier les Voitures selon qu'ils sont sélectionnés ou non.
Comme pour expliquer pourquoi vous obtenez une erreur, qui pourrait être l'une des nombreuses raisons. Généralement, le MOC ne pourront pas enregistrer si l'un de vos attributs est définie à zéro, de sorte que peut-être la cause. Vous pouvez obtenir des détails, si vous avez mis quelque chose comme le suivi
Ce sera le retour de l'erreur que vous avez couru dans. Il serait également une bonne idée de créer un journal pour vous assurer que vous avez la Voiture spécifié. Quelque chose comme
NSLog(@"selected car %@", carToSave);
juste pour être sûrCet attribut "epaClass" n'a tout simplement pas de sens, il est censé être une chaîne de tous les temps, n'est jamais une valeur NULL si quelque chose de mal à cela. Et peut-être essayer d'ajouter une valeur nulle lorsque la mise à jour de mon objet génère cette erreur.
Je peux certainement comprendre à l'aide d'un prédicat si vous êtes de chargement que de nombreuses voitures. Cela pourrait quand même être une bonne idée pour les mettre dans un local array (après extraction avec le prédicat, bien sûr), puis de les modifier à partir de là. J'ai eu des problèmes dans le passé où les chaînes fixé à néant ont écrasé mon application sur un jet, de sorte que pourrait être le problème, mais la seule façon de s'en assurer est de le tester. Peut-être de mettre en place avec une valeur par défaut, donc au moins quelque chose est présent. Mais vous dire que cela fonctionne sur le simulateur, mais pas sur l'appareil?
J'ai trouvé le problème. J'ai été en utilisant une Voiture comme un objet pour stocker le paramètre de l'utilisateur est le choix afin de stocker les 5 attributs qui est ma clé primaire (modèle, année, etc), donc mon objet était vide à l'exception pour ces 5 attributs. Je voulais utiliser mon entité comme un objet, de sorte que lors de l'enregistrement du contexte pour valider la modification, il essayait de mon objet mise à jour (c'est pourquoi des modifications ont été de travail), et de l'autre Voiture de l'objet que j'ai utilisé pour obtenir de l'utilisateur les 5 principaux attributs. Il serait peut-être confus ce que je dis, ne sais pas vraiment comment l'expliquer sans tout le code.
Mais au fond, lors de l'enregistrement du contexte, il a été de sauver ma récupérés/modification de l'entité (si bon, ce que je voulais), et une autre entité qui a été presque toutes vides que j'ai utilisé pour permettre à l'utilisateur de choisir sa voiture. Ma question est puis-je utiliser ma Voiture de classe (généré à partir de l'entité) comme un objet de base? Et merci pour votre aide @vesl!
OriginalL'auteur justin