2013-04-28 185 views
4

我已经四处搜索,但我仍然不清楚各种概念,我希望有人为我澄清。获取一对多关系数据的核心数据

当我试图保存到运动/例程实体,同时尊重某种用户的ID时,我感到困惑和头痛。

为了我对核心数据的理解和阅读方式,我设置了核心数据,它应该能够工作,并能够将信息拉入并保存到例程和练习中,同时尊重他们正在使用的用户。任何人都可以纠正我,如果我错了吗?

我认为我必须做一个查询,看起来像(在SQL术语)

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

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

任何帮助真的很感激它!

enter image description here

+3

停止思考CoreData是数据库术语。一旦你有你的用户,你所要做的就是myUser.routines(或者你的任何关系)。把关系看作属性。 – sosborn 2013-04-28 17:40:57

回答

3

是的,你需要使用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]; 

这里要注意的一点是,你需要建立反向关系,在你的日常/运动对象来比较谓词当前用户。你有哪些我认为是反向关系的用户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; 

然后确保

当使您的商店一个新的用户,您将获得somethign这样保存管理对象以将更改写入数据存储。然后这将链接常规端的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。

+0

通过逆关系表示在例程和用户实体中的userID是相同的?我没有放一个......因为我认为coredata中的关系概念的整体情况?那是我发现很难把握。用户ID <-->> userRoutine。但我想我需要在具有idUserInternal的例程中创建一个属性。正确? – 2013-04-28 17:31:23

+0

是的,它不像拥有严格的唯一ID,就像你在SQL表/行中一样。在此,您正在比较Routine/Exercise对象中包含的用户对象。因此,在实例化一个新的例程对象时,您将在例程对象中拥有一个用户元素,并且将其设置为它所属的用户。苹果建议你设置反向关系,因为它可以使核心数据的访问更快,验证更准确。 – Dev2rights 2013-04-28 17:35:32

+0

我需要看看那个。谢谢。但在你的代码示例中,它缺少如何获取用户。比方说,我正在使用FB API,而我的用户是_isLoggedin.id,这对User.idFB来说很重要。你将如何完成你的代码部分?我感到困惑 – 2013-04-28 17:40:11