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查询。