Как внести изменения в основной набор данных без повторения результатов? - PullRequest
0 голосов
/ 07 октября 2011

Если NSFetchRequest является эквивалентом базовых данных SQL-запроса, содержащего SELECT, существует ли эквивалент базовых данных команды SQL UPDATE?

Или, другими словами, если я хочу изменить значения в Базовом наборе данных, есть ли способ обойти результаты из NSFetchRequest?

В случае, если вы отвечаете «нет», я был бы очень признателен за справочную документацию. Ура!

РЕДАКТИРОВАТЬ: Под «итерацией» я имею в виду, что знаю, как выполнить цикл для объектов и изменить значения:

NSArray *results = [context executeFetchRequest:...];
for (NSManagedObject *object in results) {
    object.value = anotherValue;
}

Но если они все получают одно и то же значение в одном и том же свойстве, я бы просто хотел назвать что-то вроде [context executeChangesOnFetchRequest:...]. Конечно, этот метод не существует, но, возможно, есть более элегантный / лаконичный способ, чем цикл for.

1 Ответ

4 голосов
/ 07 октября 2011

Ну нет. Если вы хотите внести изменения в контекст объекта, в котором находятся объекты Core Data, вы должны установить соответствующие свойства в указанных объектах и ​​затем зафиксировать изменения в этом объектном контексте. Основные данные будут обрабатывать все оптимизации для вас.

Если вы просто ищете способ избежать цикла for для обновления свойств объектов в наборе результатов, вы можете попробовать использовать makeObjectsPerformSelector:withObject:.

NSFetchRequest *req = ...;
NSError *error = nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:req error:&error];
if(error != nil) {
  //oops.
} else {
   //avoid the loop:
   [results makeObjectsPerformSelector:@selector(setSomeProperty:) withObject:someValue];

   if(![self.managedObjectContext save:nil]) {
      //error during save
   }
}

Для любителей приключений, вы можете попробовать добавить категорию на NSManagedObjectContext:

@interface NSManagedObjectContext (JRAdditions)

- (BOOL) executeChanges:(NSDictionary *) changes 
       withFetchRequest:(NSFetchRequest *) request
                  error:(NSError **) error;
@end

@implementation NSManagedObjectContext (JRAdditions)

- (BOOL) executeChanges:(NSDictionary *) changes 
       withFetchRequest:(NSFetchRequest *) request
                  error:(NSError **) error {

   NSArray *results = [self executeFetchRequest:request error:error];
   if(*error || ![results count]) return NO;

   [results makeObjectsPerformSelector:@selector(setValuesForKeysWithDictionary:)
                            withObject:changes];
   return [self save:error];
}

@end

Затем вы можете назвать это так:

NSDictionary *changes = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSFetchRequest *request = ...;
NSError *error = nil;

if([self.managedObjectContext executeChanges:changes withFetchRequest:request error:&error]) {
   //done.
} else {
   //error.
}
...