2017-01-13 2 views
0

У меня есть базовая таблица данных, называемая . Формы, которые содержат атрибут objectids, который содержит разделенную запятыми строку с идентификаторами. (он может также содержать только один идентификатор) ex.Извлечь из основных данных, где значение содержит строку

objectids = "90"   // one id 
objectids = "91,23,44" // multiple ids 

я получаю ObjectID, и я хочу, чтобы соответствовать и посмотреть, если он существует в качестве значения в любых форм ->ObjectIds запись.

Важно то, что он соответствует только цельной строке. то есть. ObjectId: не должен совпадать с ObjectIds: 91, 23, 44 и т.д.

Вот отрывок из моего кода.

-(NSDictionary*)readForm:(NSString*)objectid 
{ 

    ... 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Forms"]; 
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"added_date" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
    [fetchRequest setReturnsObjectsAsFaults:NO]; 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userid == %@ AND objectids == %@ AND active == %@", user.userid, objectid, @"yes"]; 

    // *** in this fetchRequest I want to include some snippet of code to: 
    // *** Match string, but only whole string seperated by commas, unless it only has one value in which case it contains no commas. 

    NSError *err = nil; 
    NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&err]; 
    if([results count]) 
    {  
    ... 
    } 
} 

Надеюсь, это понятно.

Я просто не знаю достаточно объектива C, чтобы даже знать, какие условия искать.

Любая помощь приветствуется!

+0

Чтобы уточнить, вы хотите совместить «22,1,5», а также при поиске «1» или только «1»? I. E. Вы хотите найти один элемент в списке в записи, но не частично соответствуют элементам? Или этот список больше похож на IP-адрес, где вы хотите только совместить весь список? – uliwitness

+0

Да, извините, если objectids = "22,1,5", я хочу, чтобы «1» соответствовало (также соответствует «22» или «5») –

+0

Каковы объективы? Если они относятся к другим объектам в вашем хранилище CoreData, то это звучит так, как будто вам нужно учитывать отношение «ко многим», а не использовать один строковый атрибут для хранения нескольких ссылок. – pbasdf

ответ

2

Для сравнения строк можно использовать LIKE вместо ==, а также, для BOOL, используйте буквальный, @YES, так что ваш предикат будет:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userid == %@ AND objectids LIKE %@ AND active == %@", user.userid, objectid, @YES]; 

Для более сложного сравнения строк, вы могли бы использовать predicateWithBlock:

EDIT: читать ваши дальнейшие комментарии, я думаю, этот вопрос отвечает точно такая же проблема с использованием регулярных выражений: Form NSPredicate from string that contains id's

+0

Я следил за предоставленной вами ссылкой. Работа с регулярным выражением. –

1

Учитывая ваш пример:

objectids = "90"   // one id 
objectids = "91,23,44" // multiple ids 

В случае, если имеется только 1 id, вы можете сравнить полную строку. Если есть больше идентификаторов, они всегда либо предшествуют, либо запятой.

Может быть, вы можете использовать что-то вроде этого:

NSString *first = [NSString stringWithFormat:@"%@,%%", objectid]; 
NSString *last = [NSString stringWithFormat:@"%%,%@", objectid]; 
NSString *inBetween = [NSString stringWithFormat:@"%%,%@,%%", objectid]; 

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userid == %@ AND (objectids == %@ OR objectids LIKE %@ OR objectids LIKE %@ OR objectids LIKE %@) AND active == %@", user.userid, objectid, first, last, inBetween, @"yes"]; 

который должен сделать заявление, как:

  • ObjectIds IS точно "90" ИЛИ
  • ObjectIds начинается с "90," ИЛИ
  • контактные линзы в комплекте с ", 90" OR
  • описание объекта "содержит 90,
Смежные вопросы