2013-02-19 6 views
0

У меня есть отношения «один ко многим» между двумя моделями, user <-->> followers, таблица последователей состоит из userId. Я хочу сделать запрос на выборку, чтобы связать пользователей с этими userId. В настоящее время мой предикат выглядит следующим образом:NSPredicate to to many many

predicate = [NSPredicate predicateWithFormat:@"ANY userId IN %@", self.user.followers]; 

Результаты: 0 результатов. Интересно, как должен выглядеть этот предикат?

Update

код я использую для добавления последователя объекты для пользователя (из данных JSON):

+ (void)insertFollowersFromDict:(NSDictionary *)dictionary forUser:(User *)user inManagedObjectContext:(NSManagedObjectContext*)moc 
{ 
    NSArray *followers = [dictionary objectForKey:@"data"]; 

    if (followers.count != 0) { 
     NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Follower" inManagedObjectContext:moc]; 
     for (NSString *followerId in followers) { 
      Follower *newFollower = [[Follower alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:moc]; 
      NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; 
      newFollower.user = [User findUser:[numberFormatter numberFromString:followingId] inManagedObjectContext:moc]; 
      [user addFollowersObject:newFollower]; 
     } 
    } 
} 

кода я использую для настройки ячеек в моем Tableview:

// This for some reason always result in the same user. 
Follower *follower = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
User *cellUser = follower.user; 

// Always self.user 
cell.text = cellUser.name 

------------------------ 
I Anders    I 
------------------------ 
------------------------ 
I Anders    I 
------------------------ 

Я не уверен, почему это происходит.

+0

@flexaddicted Спасибо и да. Кроме того, см. Мое редактирование, вы думаете, что это может быть связано? – Anders

+0

Андерс, извините, я удалил свой комментарий. ИМХО, @ Ответ Леви на правильном пути. –

+0

Вам нужно отобразить имя пользователя или подписчиков? –

ответ

3

Андерс,

Я попытаюсь представить некоторые подробности о модели, я думаю, хорошо подходит для пусть ваше приложение работает.

Во-первых, ваша модель должна выглядеть следующим образом (я пропустил атрибуты, как вы можете видеть).

enter image description here

User связан с нулем или многих Follower с.

Сообщите мне об отношениях.

followers отношение ко многим отношением к объекту Follower. Он установлен так.

enter image description here

Как вы можете видеть, отн является необязательным так как пользователь не может иметь никакого последователя. Правило удаления: cascade, так как если вы удалите пользователя, его последователи будут удалены.

user напротив, это относится к пользователю. Похоже на это.

enter image description here

Это не необязательно так последователь может существовать только с пользователем. Это аннулирует, так как если вы удалите последователя, это изменение не повлияет на связанного пользователя.

ПРИМЕЧАНИЕ Я создал модель на основе спецификаций, которые вы предоставляете, но я думаю, что она также может быть расширена для соответствия отношениям «многие ко многим». Это означает: у разных пользователей могут быть одни и те же последователи.

Теперь, если вы создаете запрос на выборку с Follower, вы можете получить все последователи, принадлежащие определенному пользователю, следующим образом.

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Follower"] 
[request setPredicate:[NSPredicate predicateWithFormat:@"user == %@", self.user]]; 
NSArray* results = // execute the request here 

// results will contain the followers for a specific user (i.e. the one you used in the predicate) 

Надеюсь, что это поможет.

Редактировать

NSManagedObject* follower = [followerResults objectAtIndex:[indexPath row]]; // this gives you a follower, put some error control if followerResults has no elements 
NSManagedObject* user = [follower objectForKey:@"user"]; // this gives you the user associated to that follower 

Edit 2

Я никогда не ясно, что вы имеете в виду, но поведение является правильным, так как вы используете

cell.text = cellUser.name 

Таким образом, вы извлекаете имя, связанное с пользователем. Существует только один пользователь, связанный с этим набором последователей.

например. пользователь Андрей имеет ноль или много последователей (Майк, Боб, Тодд).

Используемый вами запрос на выборку: Дайте мне всех последователей, где пользователь Andrew.

Если вы хотите отобразить последователей изменить как

cell.text = follower.name; // if Follower entity has a name attribute 

ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ ВАЖНО

Добавить новый атрибут (не отношения) к вашему Follower сущности. Вызывается name и делает это типа NSString. Как и для объекта User (я полагаю).

Затем, когда вы создаете новый объект Follower вы установите его, как

newFollower.user = // set the user 
newFollower.name = // set the name 

Я действительно предлагаю, чтобы понять разницу bewteen ATTRIBUTES и ОТНОШЕНИЙ.

Первые являются свойствами определенного объекта (например, имя, возраст, пол). Последние являются связями между сущностями.

+0

. Спасибо и @Levi тоже, что я пропустил раньше, так это то, что он вернул всех последователей в качестве набора. Хороший и всесторонний ответ! Один из выпущенных вопросов, если я получу всех последователей в качестве набора, как я могу восстановить правильного пользователя, например, в качестве примера - - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath'? – Anders

+0

@ Аnders Я добавил для вас редактирование. Пожалуйста, проверьте код, потому что я написал от руки. Если этот вопрос (или вопрос Леви) завершает ваше понимание сценария, вы должны подумать, чтобы предложить щедрость и отметить ответ как правильный. Хорошего дня. ;) –

+0

Спасибо. У меня все еще есть проблемы. В представлении tableview указано 'self.user' (но правильное количество ячеек). Я добавил редактирование в свой первоначальный вопрос. – Anders

3

У вас должна быть связь между объектами. Вам не нужно хранить userID в объекте Follower. Таким образом, вы можете просто написать:

predicate = [NSPredicate predicateWithFormat:@"user = %@", self.user]; 

Это вернет все Followers, которые имеют отношение к self.user. Надеюсь это поможет.

+0

Значит, вы имеете в виду, что модель пользователя должна иметь отношение к ней самостоятельно (в вашем примере называется пользователь)? – Anders

+0

@ Anders Да, это называется обратными отношениями, и вы всегда должны иметь обратные отношения. Основные данные используют их для поддержания целостности графа. –

+0

+1 для вашего ответа. Это мило. Мой предыдущий комментарий был сфокусирован на синтаксисе предложения IN, но вы поняли здесь. –