2010-04-28 4 views
4

Я хочу перебирать все объекты в моем NSManagedObjectContext и обновлять их вручную. Затем каждый управляемый объект должен быть обновлен. Каков наилучший способ сделать это?Итерации через объекты NSManagedObjectContext?

+1

Что вы пытаетесь сделать? Почему, по-вашему, вам нужно это делать? –

+0

Впервые многие объекты создаются с неправильной информацией. Мне нужно вручную исправить это. – cactus

ответ

5

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

// Given some NSManagedObjectContext *context 
NSManagedObjectModel *model = [[context persistentStoreCoordinator] 
           managedObjectModel]; 
for(NSEntityDescription *entity in [model entities]) { 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    [request setEntity:entity]; 
    NSError *error; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    // Error-checking here... 
    for(NSManagedObject *object in results) { 
     // Do your updates here 
    } 
}

Примечания вы можете отливать NSManagedObjects возвращается по мере необходимости, либо путем тестирования класса равенства (используя isKindOfClass: или связанный метод) или выяснить, какой класс текущего объекта является (с использованием managedObjectClassName собственности на entity в соединение с методом NSClassWithName()).

+0

Кастинг не требуется, все методы выборки и -объектAtIndex: метод возвращает id. Все свойства в объекте NSManagedObject могут быть доступны через KVC и могут быть запрошены через -doesRespondToSelector: –

+0

Правда, но я склонен расстраиваться с кодом, который усеяно 'isRespondToSelector:' call-casting, хотя и не является строго необходимым, может быть более читабельны в будущем. – Tim

4

Это похоже на очень тяжелый подход к проблеме. Если данные загружаются с плохими данными, тогда я бы сильно предложил исправить его, пока вы импортируете данные. Ответ Тима будет работать на то, что вы делаете, но я сильно подозреваю, что вы ошибаетесь. Итерация всей базы данных, которая ищет потенциально плохие данные, очень неэффективна.

+0

Я бы согласился с таким подходом гораздо больше, чем ответом, который я опубликовал, - если вы впервые знаете, что данные импортируются «в первый раз», тогда вы сможете исправить это при импорте, а не позже. – Tim

0

Если управляемые объекты создаются с использованием «неправильных данных», я бы проверял, чтобы вы установили значения по умолчанию в своей модели для всех свойств всех объектов. Таким образом, вы можете быть уверены, что всякий раз, когда вы вставляете объект в свой контекст, он будет содержать эти значения. Оттуда вы можете настроить свойства так, как вам нужно.

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