具有一对多关系的核心数据 - Save/Load

Core Data with relationship one to many - Save/Load

场景如下:

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

所以我正在下载数据并将 JSON 解析为 2 NSMutableArrays。 Beacon 对象有一些变量和变量 ID。 Action 对象也有一些字符串变量和关系 beacon,它是与 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 对象和 actionArray Action

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

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

在回答你的问题之前,先做一些笔记。

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

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

在你的for循环中做

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

其次,我会将 Beacon 模型中的 id 标识符重命名为 beaconID 或其他名称。 id 是一个关键字,表示指向通用对象的指针。我还将 action 重命名为 actions 只是为了强调 BeaconAction.

之间的一对多关系

第三,您可以使用 NSManagedObject subclass.

而不是使用普通托管对象

说到这里,关于你的问题。

I know that I have to use nested loop but how I am supposed to add the relationship for each action with the beacon?

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

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

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

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

Also I need to overwriting the data each time that the user is downloading the new data.

这取决于您需要实现的目标。你有什么要求?

Should I stop concidering to use Core Data?

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