2010-04-20 5 views
0

У меня есть объект под названием «Job» с двумя логическими атрибутами с именем «завершено» и «зарегистрирован». Я пытаюсь получить все завершенные задания, которые не были зарегистрированы при запуске приложения, и изменить их для входа в систему. Я в состоянии получить всю завершенную, но Незарегли работу с этим fetchRequest:Изменение управляемых объектов в NSArray

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(completed == %@ && logged == %@)", [NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO]]; 

Я тогда присваивающим этот предикат к fetchRequest и вызывающему [managedObjectContext executeFetchRequest: fetchRequest] метод, чтобы получить массив все Иова которые соответствуют этим критериям. Это, похоже, работает нормально и возвращает правильное количество рабочих мест.

То, что я пытаюсь сделать, - это преобразовать NSArray в исходное состояние, установить атрибут logged в YES и затем сохранить. Это похоже на завершение и не возвращает никаких ошибок, но изменения не сохраняются, когда приложение завершает работу. Где я иду не так?

[fetchRequest setPredicate:predicate]; 
NSError error; 
NSArray jobsToLog = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if ([jobsToLog count] > 0) { 
    for (int i = 0; i < [jobsToLog count] - 1; i++) { 
     [[jobsToLog objectAtIndex:i] setLogged:[NSNumber numberWithBool:YES]]; 
     // Commit the changes made to disk 
     error = nil; 
     if (![managedObjectContext save:&error]) { 
     // An error occurred 
     } 
    } 
} 

Благодаря в ожидании,

ответ

1

Во-первых, вы можете очистить вещи немного через:

[fetchRequest setPredicate:predicate]; 
NSError *error = nil; 
NSArray jobsToLog = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
NSAssert1(error == nil, @"Error retrieving jobs: %@", [error userInfo]); 
for (id job in jobsToLog) { 
    [job setValue:[NSNumber numberWithBool:YES] forKey:@"logged"]; 
} 
if (![managedObjectContext save:&error]) { 
    NSAssert1(NO, @"Failed to save %@", [error userInfo]); 
} 
  • Обратите внимание, что я начинаю с error, являющегося нолем d - указатель (ваша декларация не была). Если вы этого не сделаете, исходное состояние этого указателя не определено и определенно не равно нулю.
  • Проверьте, нет ли ошибки в выборке.
  • Проверка на счет не нужна, поскольку быстрый перечислитель обрабатывает ее для вас.
  • Сохранение после того, как каждый объект расточителен, если у вас нет тысяч объектов, сохраните их в конце.
  • Пройдите свой код в отладчике и убедитесь, что вы возвращаете объекты и перебираете их.
+0

Большое спасибо! Гораздо более чистый код, чем я был выпущен :) – Garry

0

Что делать, если вы используете (кодирование Key Value) метод KVC:

[[jobsToLog objectAtIndex:i] setValue:[NSNumber numberWithBool:YES] forKey:@"logged"]; 

У вас есть setLogged метод в пользовательских NSManagedObject класса?

0

Я не эксперт здесь, но я думаю, вам нужно указать контекст управляемого объекта, используя setPrimitiveValue: внести изменения. Поэтому попробуйте это.

[self willChangeValueForKey:@"logged"]; 
[self setPrimitiveValue:[NSNumber numberWithBool:YES] forKey:@"logged"]; 
[self didChangeValueForKey:@"logged"]; 
1

Некоторые замечания, которые могут помочь:

для цикла зацикливается от 0 до одного меньше, чем кол. Это пропустит последнее задание. Если будет только 1 работа, ничего не произойдет. Изменение цикла для:

for (int i = 0; i < [jobsToLog count]; i++) 

или

for (int i = 0; i <= [jobsToLog count] - 1; i++) 

При извлечении объектов из NSArray компилятор не будет знать его тип. Вы должны явно привести объект:

[(Job *)[jobsToLog objectAtIndex:i] setLogged:[NSNumber numberWithBool:YES]]; 

Вы можете сделать оба выше, используя быстрое перечисление:

for(Job *thisJob in jobsToLog) { 
    [thisJob setLogged:[NSNumber numberWithBool:YES]; 
} 
+0

Кастинг совершенно не нужен, потому что вы получаете идентификатор обратно, который будет принимать вызов любого метода, пока класс не узнает, что метод существует через импорт. Кастинг в Objective-C ошибочен в 99,9% случаев. –

+0

@Marcus S. Zarra: Можете ли вы объяснить свой комментарий для меня? Я размышлял об этом некоторое время и не совсем понимаю, почему использование идентификатора лучше, чем явно бросать то, что вы ожидаете в массиве. – MrHen

Смежные вопросы