我正在开发一个函数来从我的网络服务中获取 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 服务中使用相同的格式,会有什么问题吗?(作者 ID)
注意:我可以在服务器端只用一行代码轻松转换名称。所以,这些都很好,只是想把它做好并避免未来的问题
如何动态设置值。我相信一定有办法做到这一点。我尝试了以下代码但没有运气
[book performSelector:selector] = [book objectForKey:key];
注意:这背后的原因是网络服务目前正在开发中,它的数据库每天都在更新。
编辑
找到问题 2 的解决方案
[book performSelector:sel withObject:value];
我要做的是以某种方式将 author_id 转换为 setAuthor_id(或 authorId 为 setAuthorId)。