【问题标题】:Core data fetching one to many relationship data获取一对多关系数据的核心数据
【发布时间】:2013-04-28 17:21:24
【问题描述】:

我已经四处搜索,但我仍然不清楚我希望有人为我澄清的各种概念。

当我在尊重某种用户 ID 的同时尝试保存到锻炼/例程实体中时,我感到困惑和头痛。

根据我设置核心数据的方式理解和阅读核心数据,它应该可以工作,并且能够在尊重与他们一起工作的用户的同时将信息提取并保存到常规和锻炼中。如果我错了,谁能纠正我?

我想我必须做一个看起来像(用 SQL 术语)的查询

INSERT INTO Routine (Values) WHERE Routine.userID = user.usersExercise

正确吗?如果这是正确的。现在我遇到的问题是,我不知道如何在 coreData 代码中对这两个实体进行内部连接以生成这样的查询。

任何帮助都非常感谢!

【问题讨论】:

  • 别再想CoreData是数据库术语了。一旦你有了你的用户,你所要做的就是 myUser.routines (或任何你的关系)。将关系视为属性。

标签: ios xcode core-data


【解决方案1】:

是的,您需要使用 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 找到那个。

【讨论】:

  • 反向关系是指Routine和User实体中相同的userID?我没有放一个....好像我认为coredata中关系概念的全部内容?这就是我发现很难掌握的东西。用户 ID > 用户例程。但我认为我需要在例程中创建一个具有 idUserInternal 的属性。对吗?
  • 是的,它不像在 SQL 表/行中那样拥有严格的唯一 ID。在这里,您正在对包含在您的 Routine/Exercise 对象中的 User 对象进行直接比较。因此,当实例化一个新的 Routine 对象时,您的 Routine 对象中将有一个 User 元素,您也可以将其设置为它所属的用户。 Apple 建议您设置反向关系,因为它可以使访问速度更快,并且在后台使用核心数据进行更准确的验证。
  • 那我需要查一下。谢谢。但是在您的代码示例中,它缺少如何获取用户。假设我正在使用 FB API,而我的用户是 _isLoggedin.id,它与 User.idFB 相同。你将如何完成你的代码的那部分?我很困惑
  • 好的,我已经添加了如何获取用户,但它与从商店获取任何其他对象相同。
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多