与许多关系进行NSPredicate

时间:2013-02-19 21:07:38

标签: ios cocoa-touch core-data nspredicate

我在两个模型user <-->> followers之间存在一对多关系,关注者表由userId组成。我想制作一个获取请求,以便将相关用户提供给theese userId。我的谓词目前看起来像这样:

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

这导致0结果。我想知道这个谓词应该是什么样的?

更新

我用来向用户添加关注者对象的代码(来自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 
------------------------

我不确定为什么会这样。

2 个答案:

答案 0 :(得分:3)

你应该在对象之间建立关系。您不必将userID存储在Follower对象中。这样你就可以简单地写:

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

这会返回与Followers有关系的所有self.user。希望这会有所帮助。

答案 1 :(得分:3)

的Anders,

我会尝试提供一些我认为非常适合让您的应用运行的模型的详细信息。

首先,您的模型应如下所示(我跳过属性,如您所见)。

enter image description here

User与零个或多个Follower相关联。

让我知道关于人际关系的讨论。

followers是与Follower实体的多对多关系。它是这样设置的。

enter image description here

如您所见,rel是可选,因为用户无法拥有任何关注者。删除规则为级联,因为如果删除用户,其关注者也将被删除。

相反,

user是针对用户的。它看起来像这样。

enter image description here

它不是可选,因为关注者只能与用户一起存在。它是 nullify ,因为如果删除关注者,则更改将不会对关联用户产生影响。

注意我根据您提供的规范创建了模型,但我认为它也可以扩展为适合多对多关系。这意味着:不同的用户可以拥有相同的关注者。

现在,如果您针对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

修改2

我不清楚你的意思,但行为是正确的,因为你正在使用

cell.text = cellUser.name

通过这种方式,您可以检索与用户关联的名称。 只有一个用户与该组关注者相关联

e.g。用户Andrew有零个或多个粉丝(Mike,Bob,Todd)。

您使用的获取请求执行以下操作:向我提供用户为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

我真的建议了解属性关系之间的区别。

前者是特定实体的属性(例如姓名,年龄,性别)。后者是实体之间的联系。