2010-11-04 2 views
24

J'ai les bases de l'insertion d'enregistrements et de la suppression d'enregistrements avec des données de base; cependant, j'apprécierais l'aide avec une des fonctions les plus communes - le insèrent/mettent à jour.Comment effectuer une insertion/mise à jour avec des données de base

Fondamentalement, j'utilise NSMutableArrayarrayWithContentsOfURL pour obtenir un tableau qui contient des lignes d'une table mysql. Ce que je dois faire est maintenant de synchroniser mon magasin CoreData. En d'autres termes, j'ai besoin d'ajouter chaque ligne du tableau à ma table CoreData mais si elle existe déjà, j'ai besoin de mettre à jour l'enregistrement avec les dernières valeurs. Aussi, s'il existe dans les données de base et non dans le tableau téléchargé, je devrais le supprimer.

Je pourrais probablement bidouiller cela ensemble; Cependant, j'aimerais voir comment cela se fait correctement et efficacement sans fuites de mémoire.

+0

Je sais que c'est en retard, mais si vous supprimez des éléments des données de base qui n'existent pas dans le tableau, pourquoi ne supprimez-vous pas tous les éléments des données de base et insérez-en tous les nouveaux. insérer ou mettre à jour ceux qui existent est probablement beaucoup plus facile. – Ben

+0

@Ben: bonne suggestion, mais ne serait-ce pas potentiellement beaucoup plus lent? Surtout dans le cas d'une table avec de nombreuses entrées et seulement un couple qui doit être changé. Faire autant d'écriture quand vous n'en avez pas besoin pourrait être significatif, n'est-ce pas? – GeneralMike

+0

@GeneralMike oui certainement plus efficace si vous avez beaucoup de lignes. Je n'avais pas à l'époque appris la bonne façon de le faire :) – Ben

Répondre

34

Il y a deux façons d'insérer des données dans les données de base - et celle que vous utilisez dépend de vous. Cependant, l'un d'entre eux dépend si vous avez généré des classes Model pour votre modèle de données pour la base de données de base de données.

La façon régulière est d'utiliser les éléments suivants:

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context]; 
[object setValue:@"value1" forKey:@"stringColumn"]; 
[object setValue:12 forKey:@"numberValue"]; 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Failed to save - error: %@", [error localizedDescription]); 
} 

Ceci est en supposant que vous avez déjà votre contexte d'objet géré mis en place. Il est beaucoup plus efficace de créer et d'insérer vos objets dans le contexte d'une boucle, puis de les enregistrer après la fin de la boucle.

L'autre méthode n'est pas très différente, mais est beaucoup plus sûre en termes de sécurité de type. Si vous avez généré des classes de modèles (que vous pouvez faire à partir des xcdatamodels), vous pouvez simplement créer un objet de cette classe et définir ses propriétés.

TableObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context]; 
[object setStringColumn:@"value1"]; 
[object setNumberValue:12]; 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Failed to save - error: %@", [error localizedDescription]); 
} 

Pour supprimer à partir d'une table, récupérer simplement l'objet de la table (je suppose que vous utilisez la deuxième méthode ici pour les insertions, et en tant que tels ont généré des classes de modèle) et utiliser les éléments suivants:

[context deleteObject:object]; 

Notez que vous devrez appeler save pour que cela prenne effet également.

Espérons que cela aide! Bonne chance!

EDIT: Désolé, j'ai dû mal lire la question!

Pour examiner un enregistrement existant, vous devez créer une demande d'extraction, puis l'exécuter dans votre contexte d'objet géré. Au strict minimum, une requête d'extraction nécessite une entité (afin qu'elle sache quelle table rechercher). Pour spécifier les termes de recherche, vous devez créer un prédicat (sinon la requête retournera simplement tout dans la table). Vous pouvez également spécifier un ensemble de descripteurs de tri afin que vos résultats soient triés.

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"table" inManagedObjectContext:context]; 
[request setEntity:entity]; 

NSError *errorFetch = nil; 
NSArray *array = [context executeFetchRequest:request error:&errorFetch]; 

Ce code crée une requête d'extraction et renvoie chaque objet de la table nommée "table" dans un tableau. À partir d'ici, puisque tous les objets requis sont dans le tableau, vous pouvez inspecter et modifier les enregistrements. Si vous faites des changements, n'oubliez pas de sauvegarder le contexte! La boucle suivante enregistre la première valeur dans chaque objet, en utilisant la même table que les exemples ci-dessus.

for(TableObject *object in array) 
{ 
    NSLog(@"object value1 = %@", object.value1); 
} 

Vous pouvez également supprimer des enregistrements à partir de ce point en utilisant la fonction mentionnée ci-dessus.

Pour plus d'informations sur les requêtes d'extraction, veuillez regarder le class reference. Je vous recommande également de lire sur les descripteurs et les prédicats de tri, car ils sont très importants pour la recherche de votre base de données de base de données, et certains d'entre eux sont moins efficaces que d'autres (en particulier dans la création de NSPredicates).

Bonne chance!

+0

Salut Andrew, merci pour la réponse. Je comprends déjà comment insérer des enregistrements dans les données de base en utilisant NSManagedObject comme je l'ai mentionné dans la question. Je cherche de l'aide avec le code pour examiner les enregistrements qui existent déjà dans les données de base puis les mettre à jour, les supprimer ou en insérer de nouveaux en fonction des enregistrements dans un NSMutableArray que j'ai téléchargé. – slevytam

Questions connexes