JSON和Core数据 [英] JSON and Core Data on the iPhone

查看:104
本文介绍了JSON和Core数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个核心数据对象图(由通过一对多关系链接的两个实体组成)。



我很好奇,作为一个相对没有经验的iPhone开发者,无论是否有人可以推荐一种方法,以及适用于iPhone的JSON实现,这将允许我: p>

1)将核心数据记录转换为JSON字符串(同时保持实体之间的关系);和



2)将JSON字符串转换回核心数据对象(再次保留实体之间的关系)。



解决方案

首先,我们已经搜索了一个教程/代码示例,但没有成功。 ,选择一个JSON库来使用,我个人喜欢TouchJSON,但其他几个也很不错。复杂的部分,虽然不是很难,是将您的托管对象转换为合适的结构进行转换。我写这个真的很快,所以它可能有一个或两个错误)



你调用的方法是:

   - (NSString *)jsonStructureFromManagedObjects:(NSArray *)managedObjects; 
- (NSArray *)managedObjectsFromJSONStructure:(NSString *)json withManagedObjectContext:(NSManagedObjectContext *)moc;

实现如下:

   - (NSDictionary *)dataStructureFromManagedObject:(NSManagedObject *)managedObject 
{
NSDictionary * attributesByName = [[managedObject entity] attributesByName];
NSDictionary * relationshipsByName = [[managedObject entity] relationshipsByName];
NSMutableDictionary * valuesDictionary = [[managedObject dictionaryWithValuesForKeys:[attributesByName allKeys]] mutableCopy];
[valuesDictionary setObject:[[managedObject entity] name] forKey:@ManagedObjectName];
for(NSString * relationshipName in [relationshipsByName allKeys]){
NSRelationshipDescription * description = [[[managedObject entity] relationshipsByName] objectForKey:relationshipName];
if(![description isToMany]){
NSManagedObject * relationshipObject = [managedObject valueForKey:relationshipName];
[valuesDictionary setObject:[self dataStructureForManagedObject:relationshipObject] forKey:relationshipName];
continue;
}
NSSet * relationshipObjects = [managedObject objectForKey:relationshipName];
NSMutableArray * relationshipArray = [[NSMutableArray alloc] init];
for(NSManagedObject * relationshipObject in relationshipObjects){
[relationshipArray addObject:[self dataStructureForManagedObject:relationshipObject]];
}
[valuesDictionary setObject:relationshipArray forKey:relationshipName];
}
return [valuesDictionary autorelease];
}

- (NSArray *)dataStructuresFromManagedObjects:(NSArray *)managedObjects
{
NSMutableArray * dataArray = [[NSMutableArray alloc] init];
for(NSManagedObject * managedObject在managedObjects中){
[dataArray addObject:[self dataStructureForManagedObject:managedObject]];
}
return [dataArray autorelease];
}

- (NSString *)jsonStructureFromManagedObjects:(NSArray *)managedObjects
{
NSArray * objectsArray = [self dataStructuresFromManagedObjects:managedObjects];
NSString * jsonString = [[CJSONSerializer serializer] serializeArray:objectsArray];
return jsonString;
}

- (NSManagedObject *)managedObjectFromStructure:(NSDictionary *)structureDictionary withManagedObjectContext:(NSManagedObjectContext *)moc
{
NSString * objectName = [structureDictionary objectForKey:@ ManagedObjectName];
NSManagedObject * managedObject = [NSEntityDescription insertNewObjectForEntityForName:objectName inManagedObjectContext:moc];
[managedObject setValuesForKeysWithDictionary:structureDictionary];

for(NSString * relationshipName in [[[managedObject entity] relationshipsByName] allKeys]){
NSRelationshipDescription * description = [relationshipsByName objectForKey:relationshipName];
if(![description isToMany]){
NSDictionary * childStructureDictionary = [structureDictionary objectForKey:relationshipName];
NSManagedObject * childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
[managedObject setObject:childObject forKey:relationshipName];
continue;
}
NSMutableSet * relationshipSet = [managedObject mutableSetForKey:relationshipName];
NSArray * relationshipArray = [structureDictionary objectForKey:relationshipName];
for(NSDictionary * childStructureDictionary in relationshipArray){
NSManagedObject * childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
[relationshipSet addObject:childObject];
}
}
return managedObject;
}

- (NSArray *)managedObjectsFromJSONStructure:(NSString *)json withManagedObjectContext:(NSManagedObjectContext *)moc
{
NSError * error = nil;
NSArray * structureArray = [[CJSONDeserializer deserializer] deserializeAsArray:json error:& error];
NSAssert2(error == nil,@无法反序列化\\\
%@ \\\
%@,[error localizedDescription],json);
NSMutableArray * objectArray = [[NSMutableArray alloc] init];
for(NSDictionary * structureDictionary in structureArray){
[objectArray addObject:[self managedObjectFromStructure:structureDictionary withManagedObjectContext:moc]];
}
return [objectArray autorelease];
}

现在这是递归的,所以你可以很容易地结束翻译你的整个持久存储if你不小心。观察你的关系,并确保他们只去对象树,以便只能得到你想要翻译的对象。


I have a core data object graph (consisting of two entities linked by a to-many relationship).

I was curious, as a relatively inexperienced iPhone developer, whether anyone could recommend an approach, and a suitable JSON implementation for the iPhone, which would allow me to:

1) convert the core data records into a JSON string (whilst maintaining the relationship between the entities); and

2) convert the JSON string back into core data objects (again preserving the relationship between entities).

I have searched, unsuccessfully, for a tutorial/code sample on this point so any assistance would be gratefully received.

解决方案

First, pick a JSON library to use, I personally like TouchJSON but several others out there are quite nice as well. The complicated part, although not very hard, is to convert your managed objects into suitable structures for the conversion. I wrote this real quick so it may have an error or two :)

The methods you call are:

- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects;
- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc;

And the implementation is as follows:

- (NSDictionary*)dataStructureFromManagedObject:(NSManagedObject*)managedObject
{
  NSDictionary *attributesByName = [[managedObject entity] attributesByName];
  NSDictionary *relationshipsByName = [[managedObject entity] relationshipsByName];
  NSMutableDictionary *valuesDictionary = [[managedObject dictionaryWithValuesForKeys:[attributesByName allKeys]] mutableCopy];
  [valuesDictionary setObject:[[managedObject entity] name] forKey:@"ManagedObjectName"];
  for (NSString *relationshipName in [relationshipsByName allKeys]) {
    NSRelationshipDescription *description = [[[managedObject entity] relationshipsByName] objectForKey:relationshipName];
    if (![description isToMany]) {
      NSManagedObject *relationshipObject = [managedObject valueForKey:relationshipName];
      [valuesDictionary setObject:[self dataStructureForManagedObject:relationshipObject] forKey:relationshipName];
      continue;
    }
    NSSet *relationshipObjects = [managedObject objectForKey:relationshipName];
    NSMutableArray *relationshipArray = [[NSMutableArray alloc] init];
    for (NSManagedObject *relationshipObject in relationshipObjects) {
      [relationshipArray addObject:[self dataStructureForManagedObject:relationshipObject]];
    }
    [valuesDictionary setObject:relationshipArray forKey:relationshipName];
  }
  return [valuesDictionary autorelease];
}

- (NSArray*)dataStructuresFromManagedObjects:(NSArray*)managedObjects
{
  NSMutableArray *dataArray = [[NSMutableArray alloc] init];
  for (NSManagedObject *managedObject in managedObjects) {
    [dataArray addObject:[self dataStructureForManagedObject:managedObject]];
  }
  return [dataArray autorelease];
}

- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects
{
  NSArray *objectsArray = [self dataStructuresFromManagedObjects:managedObjects];
  NSString *jsonString = [[CJSONSerializer serializer] serializeArray:objectsArray];
  return jsonString;
}

- (NSManagedObject*)managedObjectFromStructure:(NSDictionary*)structureDictionary withManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSString *objectName = [structureDictionary objectForKey:@"ManagedObjectName"];
  NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:objectName inManagedObjectContext:moc];
  [managedObject setValuesForKeysWithDictionary:structureDictionary];

  for (NSString *relationshipName in [[[managedObject entity] relationshipsByName] allKeys]) {
    NSRelationshipDescription *description = [relationshipsByName objectForKey:relationshipName];
    if (![description isToMany]) {
      NSDictionary *childStructureDictionary = [structureDictionary objectForKey:relationshipName];
      NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
      [managedObject setObject:childObject forKey:relationshipName];
      continue;
    }
    NSMutableSet *relationshipSet = [managedObject mutableSetForKey:relationshipName];
    NSArray *relationshipArray = [structureDictionary objectForKey:relationshipName];
    for (NSDictionary *childStructureDictionary in relationshipArray) {
      NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];
      [relationshipSet addObject:childObject];
    }
  }
  return managedObject;
}

- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSError *error = nil;
  NSArray *structureArray = [[CJSONDeserializer deserializer] deserializeAsArray:json error:&error];
  NSAssert2(error == nil, @"Failed to deserialize\n%@\n%@", [error localizedDescription], json);
  NSMutableArray *objectArray = [[NSMutableArray alloc] init];
  for (NSDictionary *structureDictionary in structureArray) {
    [objectArray addObject:[self managedObjectFromStructure:structureDictionary withManagedObjectContext:moc]];
  }
  return [objectArray autorelease];
}

Now this is recursive so you can easily end up translating your entire persistent store if you are not careful. Watch your relationships and make sure that they only go "down" the object tree so that you only get the objects you want translated.

这篇关于JSON和Core数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆