2013-04-28 177 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