2011-08-28 4 views
0

J'essaie d'écrire des données à partir d'un NSMutableArray dans une table de données de base via une boucle NSManagedObject. Il écrit le dernier enregistrement dans le tableau plusieurs fois plutôt que d'écrire chacune des lignes distinctes dans le tableau.NSManaged Object Loop Enregistrement de la même ligne plusieurs fois

J'ai effectué une boucle d'énumération rapide sur la baie pour confirmer qu'elle contient plusieurs lignes distinctes.

Ceci est la version actuelle de ma boucle de code:

//see if there were any matching rows from All_Game_Tips_List entity and of course there should be 
if (fetchedObjectsForAttributes == nil) { 
    // do nothing as user1 does not have a saved profile 
    NSLog(@"error no matching rows found which sounds suspect"); 
} 
else 
{ 
    for (id object in fetchedObjectsForAttributes) { 
     NSLog(@"alltip_obj = %@", object); 

    NSLog(@"found exactly %i matching alltip records",[fetchedObjectsForAttributes count]);                     

//next need to write a couple of fields from the profile entity and some from All_Game_Tips_List entity to mytips table but first need to get all needed attributes for an attribute (e.g. name, tminus, etc) for an attribute 
//then insert the new row 
NSManagedObjectContext *contextForMyTips = [appDelegate managedObjectContext]; 


NSManagedObject *myTipsFromAllTips = [NSEntityDescription 
             insertNewObjectForEntityForName:@"My_Game_Tips_List" 
             inManagedObjectContext:contextForMyTips]; 
NSLog(@"start wri to mytips"); 

for (NSManagedObject *info in fetchedObjectsForAttributes) { 
    [myTipsFromAllTips setValue:[info valueForKey:@"alltip_name"]    forKey:@"mytip_name"]; 
    [myTipsFromAllTips setValue:[info valueForKey:@"alltip_alert_msg"]   forKey:@"mytip_alert_msg"]; 
    [myTipsFromAllTips setValue:[info valueForKey:@"alltip_description"]  forKey:@"mytip_description"]; 
    [myTipsFromAllTips setValue:[info valueForKey:@"alltip_id"]     forKey:@"mytip_id"]; 
    [myTipsFromAllTips setValue:[info valueForKey:@"alltip_tminus_amt"]   forKey:@"mytip_tminus_amt"]; 
    [myTipsFromAllTips setValue:[info valueForKey:@"alltip_impact_type"]  forKey:@"mytip_impact_type"]; 


} // end of for NSManagedObject loop 

     //commit the insert 
     if (![contextForMyTips save:&error]) { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
     } 
} // looping through id 

} // end of else 

Réflexions sur la raison pour laquelle il est coincé sur le dernier enregistrement dans le tableau?

Répondre

0

En effet, cercle

for (NSManagedObject *info in fetchedObjectsForAttributes) { 

enregistre uniquement le dernier objet, car il réécrit toutes les données précédemment définies. Il suffit de remplacer cette boucle avec celle-ci:

NSManagedObject *info = (NSManagedObject *)object; 

Et tout sera ok comme cercle

for (id object in fetchedObjectsForAttributes) { 

objets seront itérer un par un.

+0

Pouvez-vous expliquer un peu plus comment implémenter cela? Est-ce que je remplace seulement cela pour la boucle avec votre déclaration et laisse le reste du code? Je suis un peu confus. Merci d'avoir compris pourquoi je n'obtenais que le dernier rang. – Jazzmine

+0

Essayez simplement de supprimer le cercle 'pour (NSManagedObject * info dans fetchedObjectsForAttributes)' et remplacez-le par la chaîne 'NSManagedObject * info = (NSManagedObject *) objet;'. Regardez, il y a deux cercles à votre code: 'pour (id objet dans fetchedObjectsForAttributes)' - externe, et 'pour (NSManagedObject * info dans fetchedObjectsForAttributes)' interne. Le dernier est inutile car il se superpose à l'externe. – Nekto

+0

A travaillé aimé un champion! Merci beaucoup. – Jazzmine

0

Vous n'avez appelé qu'une seule fois insertNewObjectForEntityForName:etc., alors bien sûr, vous n'avez qu'un seul nouvel objet. Vous définissez ses attributs sur les valeurs de chacun de vos éléments dans la liste, mais à chaque fois dans la boucle, il écrase les valeurs de l'heure précédente. Il finit avec les valeurs du dernier élément.

Au lieu de cela il suffit de déplacer dans la boucle toute la ligne

NSManagedObject *myTipsFromAllTips = [NSEntityDescription 
            insertNewObjectForEntityForName:@"My_Game_Tips_List" 
            inManagedObjectContext:contextForMyTips]; 

, et il devrait être bien.

Questions connexes