我正在开发一个函数来从我的网络服务中获取JSON数据,比方说,书籍。这是一个JSON示例
"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"
},
]
我想将数据保存到sqlite的方式是这样的
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正确。但问题是。
对于Web服务(Ruby on Rails),我们通常使用小写命名,用下划线替换空格(author_id)。但是在这里,在Objective-C中,删除空格并用大写(authorId)替换每个单词的第一个字符。那么,实体属性名称应该是什么,book.author_id还是book.authorId?如果我使用与Web服务相同的格式会有任何问题吗? (AUTHOR_ID)
注意:我可以使用服务器端的一行代码轻松转换名称。所以,任何这些都很好,只是想做到正确,避免将来出现问题
如何动态设置值。我相信必须有办法做到这一点。我尝试了以下代码,但没有运气
[book performSelector:selector] = [book objectForKey:key];
注意:背后的原因是Web服务目前正在开发中,其数据库每天都在更新。
修改 的
找到问题2的解决方案
[book performSelector:sel withObject:value];
我要做的是以某种方式将author_id转换为setAuthor_id(或authorId转换为setAuthorId)。
答案 0 :(得分: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访问。