2014-01-26 3 views
0

Я использую следующие выборки запроса, чтобы удалить основные данные объекты:Количество основных объектов данных с определенным значением атрибута

NSEntityDescription *entity=[NSEntityDescription entityForName:@"entityName" inManagedObjectContext:context]; 
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    [fetch setEntity:entity]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(value1 == %@) AND (value2 == %@)", data1, data2]; 
[fetch setPredicate:predicate]; 
    //... add sorts if you want them 
    NSError *fetchError; 
    NSArray *fetchedData=[self.moc executeFetchRequest:fetch error:&fetchError]; 
for (NSManagedObject *product in fetchedProducts) { 
    [context deleteObject:product]; 
    } 

Что мне нужно будет выполнить выборки запроса только, если количество объектов в ядре объект данных с [value1 isEqualToString: @"borrar"] больше 1. Как я могу добавить это условие?

*** EDIT Атрибут value1 является переходным атрибутом.

+0

Является ли «borrar» одним из значений 'data1' или' data2', которые уже используются в предикате? –

+0

Да, это одно из значений, но если countForFetchRequest подсчитывает количество объектов, я мог бы изменить предикат и рассмотреть только data2. – mvasco

+0

Итак, вы хотите удалить все объекты со значением1 == "borrar" и значением == "someOtherString", но * только *, если есть хотя бы два объекта со значением1 == "borrar"? –

ответ

1

Чтобы проверить сколько объекты с заданным значением атрибута существует, используйте countForFetchRequest::

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"entityName"]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"value1 = %@", @"borrar"]]; 
NSError *error; 
NSUInteger count = [self.moc countForFetchRequest:request error:&error]; 
if (count == NSNotFound) { 
    // some error occurred 
} else if (count > 1) { 
    // more the one object with "value1 == borrar" 
} 

Update (в соответствии с редактируемого вопрос): Вы не можете использовать переходную атрибут в запрос выборки основных данных. Если «value1» является атрибутом переходного процесса, вы можете только извлечь все объекты с помощью «value2 == something», а затем перебрать полученный массив , чтобы проверить, существует ли более одного объекта с «value1 == borrar».

+0

Спасибо, Мартин, я проверю ваше предложение, и я думаю, что ты прав, как всегда. Благодарю вас за вашу несогласие. – mvasco

+0

Но это важно. Говоря в терминах табличного представления, мне нужно удалить одну строку из раздела (переходный атрибут для сортировки объектов по разделам), только если в этом разделе больше одного объекта. Другими словами, на каждом разделе есть специальная строка, которая должна быть удалена, если в разделе больше строк. Строка, подлежащая удалению, имеет атрибут value2, который отличается от атрибута value2 от обычных строк в его разделе. – mvasco

+0

Понял, но где в коде вы рекомендуете поставить этот запрос на выборку? – mvasco

1
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"(Value1 == borrar)"]; 
[fetch setPredicate:predicate]; 
NSError *fetchError; 
NSArray *fetchedData=[self.moc executeFetchRequest:fetch error:&fetchError]; 
for(int i=0;i<fechedData.count;i++){ 
    [context deleteObject:[fechedData objectAtIndex:i]valueForKey:@"Value1"]; 
} 
+0

Спасибо за ваше предложение. Но я думаю, вы не учли основное условие моего вопроса. Где вы рассматриваете, есть ли число объектов> 1 перед удалением объектов? Извините, если я ошибаюсь ... – mvasco

+1

if ([fechedData count]> 0) {// для оператора цикла (выше)} – Prad

+0

Спасибо, я также проверю ваше предложение. – mvasco

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