2015-01-05 59 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 
} 

我也必须在每次用户正在下载新的数据覆盖数据。

这取决于你需要达到什么。你有什么要求?

我应该停止重新使用核心数据吗?

在这种情况下,核心数据为您提供了一个结构良好的模型层。所以,你可以利用它来获取或保存数据,管理你的对象图。