具有一对多关系的核心数据 - Save/Load
Core Data with relationship one to many - Save/Load
场景如下:
每次应用程序启动时,它都会下载一个 Beacon
列表(对象)和一个 Action
列表(对象)。每个 Beacon
都分配了零个或多个操作。目前(为了简单起见)每个信标都分配了一个动作。
所以我正在下载数据并将 JSON 解析为 2 NSMutableArray
s。 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
只是为了强调 Beacon
和 Action
.
之间的一对多关系
第三,您可以使用 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 为您提供了结构良好的模型层。因此,您可以利用它来获取或保存数据、管理您的对象图。
场景如下:
每次应用程序启动时,它都会下载一个 Beacon
列表(对象)和一个 Action
列表(对象)。每个 Beacon
都分配了零个或多个操作。目前(为了简单起见)每个信标都分配了一个动作。
所以我正在下载数据并将 JSON 解析为 2 NSMutableArray
s。 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
只是为了强调 Beacon
和 Action
.
第三,您可以使用 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 为您提供了结构良好的模型层。因此,您可以利用它来获取或保存数据、管理您的对象图。