0

私は自分の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が正しいことを確認してください。しかし、問題はです。

  1. Webサービス(Ruby on Rails)の場合、通常は小文字で名前を付け、スペースをアンダースコア(author_id)に置き換えます。ただし、ここでは、Objective-Cでスペースを削除し、各単語の最初の文字を大文字(authorId)に置き換えます。では、エンティティのプロパティ名は、book.author_idまたはbook.authorIdである必要がありますか?Webサービスで同じフォーマットを使用しても問題はありませんか?(author_id)

    注:サーバー側で1行のコードを使用するだけで、名前を簡単に変換できます。だから、それらのどれでも大丈夫です、ただそれを正しくして将来の問題を避けたいだけです

  2. 値を動的に設定するにはどうすればよいですか。これを行う方法があるに違いないと思います。次のコードを試しましたが、うまくいきませんでした

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

注:この背後にある理由は、Webサービスが現在開発中であり、そのデータベースが毎日更新されているためです。

編集

質問2の解決策を見つけました

[book performSelector:sel withObject:value];

私がしなければならないのは、どういうわけか、author_idをsetAuthor_idに(またはauthorIdをsetAuthorIdに)変換することです。

4

1 に答える 1