Ios 使用NSPredicate和join

Ios 使用NSPredicate和join,ios,objective-c,nspredicate,Ios,Objective C,Nspredicate,我有两个表:用户和评论,如下所示: Users user_id (PK) name Comments comment_id (PK) user_id comment 我想获得所有用户及其评论的列表 如何使用NSPredicate 谢谢。我想,您需要这个查询: SELECT Users.*,Comments.comment_id,Comments.comment FROM Users LEFT JOIN Comments ON Users.user_id = Comments.user_id;

我有两个表:用户和评论,如下所示:

Users
user_id (PK)
name

Comments
comment_id (PK)
user_id
comment
我想获得所有用户及其评论的列表

如何使用
NSPredicate


谢谢。

我想,您需要这个查询:

SELECT Users.*,Comments.comment_id,Comments.comment FROM Users LEFT JOIN Comments ON Users.user_id = Comments.user_id;

这将返回所有用户的列表及其评论。您可以根据自己的具体要求对其进行修改。

您使用的是CoreData吗?如果是,请使用以下代码:

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"Comments",nil]];
[request setIncludesSubentities:YES];

NSArray* returnArray = [self.managedObjectContext executeFetchRequest:request error:&error];
if([returnArray count] > 0)
{
    Users* user = [returnArray objectAtIndex:0];
    NSLog(@"%@ %@ %@", user.user_id, user.name, user.userComments.comment);
}

此外,CoreData使用关系而不是外键。因此,要使这项工作正常进行,您需要设置一个从
注释到
用户的反向关系
userComments
(多对一)
。据我所知,您使用的是核心数据

首先,您必须对托管对象模型进行一个小的更改

实体
用户

属性
user\u id

name


实体
注释

属性
comment\u id

注释

关系 关系---决定---逆
用户
-
用户
-
无反向


现在,无论何时输入
注释
对象的数据,都要将用户关系关联为

 comment.user=theUser
其中,
user
是一个“Users”对象,您可以通过比较
user\u id
从“Users”表中获取该对象,为此,您可以使用一个简单的方法,如对从注释数据中获取的
userID
调用以下方法

theUser= [self isUserAlreadyExistsWithUserID:userID];
其中,方法定义可以类似于
Users
NSManagedObject子类

  +(NSManagedObject*)isUserAlreadyExistsWithUserID uniqueValue:   (id)uniqueValue
{
    NSManagedObjectContext* context=[self managedObjectContext];
    NSError*error=nil;

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:context];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id = %@",uniqueValue];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.entity = entity;
    [fetchRequest setPredicate:predicate];
    NSArray *objects = [context executeFetchRequest:fetchRequest error:&error];

    if(objects && objects.count>0)
    {
        return [objects objectAtIndex:0];
    }
    else
   {
       return nil;
   }
}

现在,要在comments NSManagedObject子类中获取特定用户的注释:

 +(NSFetchedResultsController*)getCommentsForUser:(Users*)user
  {
    NSString* cacheName=@"Root";

    [NSFetchedResultsController deleteCacheWithName:cacheName];
    NSManagedObjectContext* context=[self managedObjectContext];


    NSEntityDescription *entity = [NSEntityDescription  entityForName:NSStringFromClass([self class])   inManagedObjectContext:context];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
     NSPredicate* predicate=[NSPredicate predicateWithFormat:@"user=%@",user];
    fetchRequest setPredicate:predicate];

     NSFetchedResultsController *theFetchedResultsController =   [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:context   sectionNameKeyPath:nil
                                               cacheName:cacheName];
     return theFetchedResultsController;

}

希望这有帮助

在进行查询时,最好不要使用
NSPredicate
。您只需编写一个
JOIN
查询即可。As还指出,NSPredicate类用于定义用于约束检索或内存中筛选搜索的逻辑条件。此外,它将更容易使用。下面是一个如何使用它的例子。假设您有
注释的
NSSet
。您可以执行以下操作:

[Comments valueForKeyPath:@"users.user_id"];
但是,如果您确实想使用
NSPredicate
以下是可能的方法:

NSFetchRequest *fetchReq = [[NSFetchRequest alloc] initWithEntityName:@"Users"];
    NSError *error;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(user_id == %@)",Comments.user_id];
    [fetchReq setPredicate:predicate];
    NSArray *result = [self.managedObjectContext executeFetchRequest:fetchReq error:&error];

愚蠢的问题,但是在
用户
实体上有一个
注释
关系不是更简单吗,这样您就可以简单地获取所有用户(或至少有一条注释的所有用户),然后以
用户的身份获取给定用户的注释。注释
?或者你没有为此使用核心数据?这与NSPredicate无关。如果您使用的是SQLite,您只需要一个与@BhanuPriya一致的查询。这个问题需要更加具体。您是使用CoreData还是只需要SQL查询?NSPredicate不适用于常规SQL查询。