是的,您需要使用 NSPredicate 来获取与特定用户相关的数据。如果您正在填充 UICollection 视图,那么我建议您也阅读 NSFetchedResultsController。
NSFetchRequest *fetchRequestItems = [[NSFetchRequest alloc] init];
NSEntityDescription *entityItem = [NSEntityDescription entityForName:@"Routine" inManagedObjectContext:self.managedObjectContext];
[fetchRequestItems setEntity:entityItem];
User* myUser = //Code for getting current user out of data store based on some paramator
[fetchRequestItems setPredicate:[NSPredicate predicateWithFormat:@"userID == %@",myUser]];
//Sort by last edit ordered
NSArray *sortDescriptors = [NSArray arrayWithObjects:nil];
[fetchRequestItems setSortDescriptors:sortDescriptors];
NSArray* Routines = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
这里要注意的是,您需要在您的 Routine/Exercise 对象上设置反向关系,以与谓词中的当前用户进行比较。您对我认为是反向关系的用户 ID 有哪些?
所以从评论中我认为你没有设置反比关系,所以这里是一个粗略的例子。
在您的商店创建新用户时,您会得到如下信息:
User *thisUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext];
thisUser.eMail = emailAddress.text;
//And any other paras you might have
然后,在为该用户制定例程时,您将执行以下操作:
Routine *newRoutine = [NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext];
newRoutine.userId = thisUser;
然后确保保存托管对象以将更改写入数据存储。然后在例程端链接这 2 个对象,不要忘记在用户端也链接它以获得严格的反向关系。
为了让用户完全像我上面提到的那样:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSError* error;
NSArray* Users = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
如果您有 1 个用户,则它是数组中的第一个元素,如果您有很多用户,则使用谓词根据您的 FB id 查找那个。