ios - 具有一对多关系的核心数据 - 保存/加载

标签 ios objective-c core-data

场景如下:

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

所以我正在下载数据并将 JSON 解析为 2 个 NSMutableArrayBeacon 对象有一些变量和变量 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

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

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

最佳答案

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

首先,为什么需要创建一个空的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 循环 中,您需要创建一个操作对象并将其 beacon 关系设置为您创建的信标 (newBeacon)

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

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

+(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 为您提供了结构良好的模型层。因此,您可以利用它来获取或保存数据、管理您的对象图。

关于ios - 具有一对多关系的核心数据 - 保存/加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27782930/

相关文章:

ios - 错误 ITMS-9000 : Invalid Bundle. bundle my_app.app 不支持 Info.plist 中指定的最低操作系统版本

objective-c - 当我将 OS X 升级到 10.9 时,我的 applescript 不再工作

ios - 如何使用 Rest API 写入 Sharepoint 2013 列表

ios - NSMutableString 追加后为空

ios - CoreData 按日期因素排序

ios - 如何使用 for 循环将选项卡添加到 TabLayout

ios - 如何删除导航 Controller 后退按钮标题?

iOS 应用因 EXC_BREAKPOINT (SIGTRAP) 而崩溃

ios - 如何从核心数据表 ios 中检索数据?

objective-c - 具有非托管属性的 awakeFromFetch