私は自分のWebサービス(たとえば本)から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)
注:サーバー側で1行のコードを使用するだけで、名前を簡単に変換できます。だから、それらのどれでも大丈夫です、ただそれを正しくして将来の問題を避けたいだけです
値を動的に設定するにはどうすればよいですか。これを行う方法があるに違いないと思います。次のコードを試しましたが、うまくいきませんでした
[book performSelector:selector] = [book objectForKey:key];
注:この背後にある理由は、Webサービスが現在開発中であり、そのデータベースが毎日更新されているためです。
編集
質問2の解決策を見つけました
[book performSelector:sel withObject:value];
私がしなければならないのは、どういうわけか、author_idをsetAuthor_idに(またはauthorIdをsetAuthorIdに)変換することです。