Я пытаюсь записать данные из NSMutableArray в основную таблицу данных через цикл NSManagedObject for. Он записывает последнюю запись в массиве несколько раз, а не записывает каждую из отдельных строк в массиве.

Я выполнил быстрый цикл перечисления массива, чтобы убедиться, что в нем есть несколько отдельных строк.

Это текущая версия моего цикла кода:

  //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

Мысли о том, почему он застрял на последней записи в массиве?

0
Jazzmine 28 Авг 2011 в 21:29

2 ответа

Лучший ответ

Это потому, что круг

for (NSManagedObject *info in fetchedObjectsForAttributes) {

Сохраняет только последний объект, так как перезаписывает все ранее установленные данные. Просто замените этот цикл на этот:

NSManagedObject *info = (NSManagedObject *)object;

И все будет хорошо, как по кругу

for (id object in fetchedObjectsForAttributes ) {

Будет перебирать объекты один за другим.

0
Nekto 28 Авг 2011 в 17:34

Вы вызвали insertNewObjectForEntityForName:etc. только один раз, так что, конечно, у вас есть только один новый объект. Вы устанавливаете его атрибуты на значения из каждого из ваших элементов в списке, но каждый раз в цикле он перезаписывает значения из предыдущего раза. Он заканчивается значениями из последнего элемента.

Вместо этого просто переместите всю строку

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

В петлю, и все должно быть в порядке.

0
morningstar 28 Авг 2011 в 17:53