2015-01-05 57 views
0

的情況如下:核心數據與關係一對多 - 保存/載入

每個應用程序啓動時,它的下載量Beacon S(對象)和Action S(對象)的列表清單的時間。每個Beacon都分配了零個或多個操作。目前(和簡單),每個信標分配了一個動作。

因此,我正在下載數據並解析JSON到2 NSMutableArray s。 Beacon對象有一些變量和變量ID。 Action對象也有一些字符串變量和關係beacon這是(外鍵)相同中的變量id

我開發了一個單例來保存和加載數據。此時我的代碼看起來像這樣:

+(void)saveBeacons:(NSMutableArray*)array andAction(NSMutableArray*)actionsArray andManagedObject:(NSManagedObjectContext*)managedObject{ 

NSDictionary *jsonDict3 = [[NSDictionary alloc] init]; 

NSManagedObjectContext *context = managedObject; 

for (int i=0; i<[array count]; i++) {   

    jsonDict3 = (NSDictionary*)[array objectAtIndex:i]; 
    NSManagedObject *newBeacon = [NSEntityDescription insertNewObjectForEntityForName:@"Beacon" inManagedObjectContext:context]; 

    [newBeacon setValue:[[jsonDict3 objectForKey:@"uuid"] uppercaseString] forKey:@"uuid"]; 
    [newBeacon setValue:[jsonDict3 objectForKey:@"minor"] forKey:@"minor"]; 
    [newBeacon setValue:[jsonDict3 objectForKey:@"major"] forKey:@"major"];   
}  

NSError *error = nil; 
// Save the object to persistent store 
if (![context save:&error]) { 
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
} 

注:array包含Beacon對象和actionArrayAction

我知道我必須使用嵌套循環,但我應該如何爲每個動作添加與信標的關係?每次用戶下載新數據時,我也需要覆蓋數據。我是否應該停止使用Core Data?

PS。這就是我的核心數據設計的樣子: enter image description here

回答

2

在回答您的問題之前,很少有筆記。

首先,爲什麼你需要創建一個空的NSDictionary?而且,如果你不使用ARC,那麼呢?注意內存泄漏。

NSDictionary *jsonDict3 = [[NSDictionary alloc] init]; 

在你的循環只是做

NSDictionary *jsonDict3 = (NSDictionary*)[array objectAtIndex:i]; 

其次,我會在你的Beacon模型beaconID或別的東西重命名id標識符。 id是一個關鍵字,表示指向通用對象的指針。我還將action重命名爲actions,以突出顯示BeaconAction之間的一對多關係。

第三,您可以使用NSManagedObject subclass而不是使用普通託管對象。

說這個,關於你的問題。

我知道我必須使用嵌套循環,但我應該如何爲每個動作添加與信標的關係?

裏面你需要創建一個動作對象並設置其beacon關係到信標(newBeacon)創建

[createdAction setValue:newBeacon forKey:@"beacon"]; 

在這裏,你可以有一個問題,因爲你不知道第二for loop如果一個動作屬於一個燈塔或另一個。您應該找到一種方法來過濾特定信標的操作。通過這種方式,保存方法將變成:

+(BOOL)saveBeacon:(NSDictionary*)beaconRepresentation withActions:(NSArray*)actions { 

    // Create a Beacon 
    // For loop the array, create Actions and set the appropriate beacon relationships 
    // Return the save result 
} 

我也必須在每次用戶正在下載新的數據覆蓋數據。

這取決於你需要達到什麼。你有什麼要求?

我應該停止重新使用核心數據嗎?

在這種情況下,核心數據爲您提供了一個結構良好的模型層。所以,你可以利用它來獲取或保存數據,管理你的對象圖。