2012-05-11 90 views
0

我正在研究一个函数,以从我的Web服务中获取JSON数据,比方说,书籍。下面是一个例子JSONCoreData属性动态命名和设置实体属性

"books" : [ 
    { 
     name : "this is book name", 
     isbn_number : "this is isbn number of the book" 
     author_id : "the author id related to this book" 
    }, 
    { 
     name : "this is second book name", 
     isbn_number : "this is isbn number of the second book" 
     author_id : "the author id related to this second book" 
    }, 
] 

我想数据保存到源码的方式是这样的

NSMutableArray * bookList = [JSONDataFromServer objectForKey:@"books"]; 

[bookList enumerateObjectsUsingBlock:^(id book, NSUInteger idx, BOOL *stop){ 

    Book *bookObject = (Book *)[NSEntityDescription insertNewObjectForEntityForname:@"Book" 
          inManagedObjectContect:mangedObjectContext]; 

    for (id key in book) { 
     SEL selector = NSSelectorFromString(key); 
     if ([bookObject respondToSelector:selector]){ 
      // do something to set bookObject attribute (which is the name as key) 
     } 
    } 

    if (![managedObjectContext save:&error]){ 
     NSLog(@"%@", [error localizedDescription]); 
    } 
} 

*** I hope you can see what I'm doing *** 

通过这样做,我没有手动设置每个属性的值。我只需更新应用程序迁移以与Web服务器匹配,请确保JSON是正确的。但问题是。

  1. 对于Web服务(Ruby on Rails),我们通常以小写字母命名,用下划线替换空格(author_id)。但在这里,在Objective-C中,删除空格并用大写字母(authorId)替换每个单词的第一个字符。那么,实体属性名称应该是book.author_id还是book.authorId?如果我在Web服务中使用相同的格式,会不会有问题? (author_id)

    注意:我只需在服务器端使用一行代码即可轻松转换名称。所以,其中任何一个都没问题,只是想把它做好,避免将来出现问题

  2. 如何动态设置数值。我相信一定有办法做到这一点。我想下面的代码,但没有运气

    [book performSelector:selector] = [book objectForKey:key];

注:每天这背后的原因是,Web服务目前正在开发,其数据库已经更新。

编辑

发现问题2

[book performSelector:sel withObject:value]; 

我所要做的就是AUTHOR_ID转换为setAuthor_id(或AUTHORID到setAuthorId)莫名其妙的解决方案。

回答

0

关于你的第二个问题,你使用xcode来生成数据库对象的可视化地图吗?即书? (你似乎已经这样做了),然后为你的图书实体生成一个NSManagedObject。即Book.hm

然后,你可以通过使用点符号来访问/改变你的bookObject的属性,即bookObject.name = [book ObjectForKey:@“name”]; bookObject.id = [book ObjectForKey:@“id”]等等,因为您的书籍属性将是Book.hm中定义的属性。

对于你的第一个问题,当你在书或其他对象上生成NSManagedObject时,xCode会自动为你做。这实际上取决于您如何添加/设置书对象的实体,如果将其设置为author_id,则可以将其作为book.author_id进行访问。