核心数据,关系一对多 - 保存/加载

时间:2015-01-05 15:46:40

标签: ios objective-c core-data

方案如下:

每次应用程序启动时,都会下载Beacon s(对象)列表和Action s(对象)列表。每个Beacon都分配了零个或多个操作。目前(简单)每个信标都分配了一个动作。

所以我正在下载数据并将JSON解析为2 NSMutableArrayBeacon对象有一些变量和变量ID。 Action对象还有一些字符串变量和beacon之间的关系,它是(外键)与id中的变量Beacon相同。

我开发了一个单例来保存和加载数据。此时我的代码如下:

+(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对象,actionArray包含Action

我知道我必须使用嵌套循环,但我应该如何为灯塔添加每个动作的关系?此外,每次用户下载新数据时,我都需要覆盖数据。我应该停止使用核心数据吗?

PS。这就是我的核心数据设计的样子: enter image description here

1 个答案:

答案 0 :(得分:2)

在回答你的问题之前,很少有笔记。

首先,为什么需要创建一个空的NSDictionary?而且,如果你不使用ARC呢?注意内存泄漏。

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

在for循环中,只需执行

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

其次,我会将id模型中的Beacon标识重命名为beaconID或其他内容。 id是一个关键字,表示指向通用对象的指针。我还要将action重命名为actions,以突出显示BeaconAction之间的一对多关系。

第三,不是使用普通的托管对象,而是使用NSManagedObject subclass

这是关于你的问题。

  

我知道我必须使用嵌套循环但是我应该如何为每个动作添加与信标的关系?

在第二个for loop内,您需要创建一个操作对象并将其beacon关系设置为您创建的信标(newBeacon

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

您可能会遇到问题,因为您不知道某个操作是属于信标还是属于另一个。您应该找到一种方法来过滤特定信标的操作。这样,save方法就可以成为:

+(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
}
  

每次用户下载新数据时,我都需要覆盖数据。

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

  

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

在这种情况下,Core Data为您提供结构良好的模型层。因此,您可以利用它来获取或保存数据,管理对象图。