CoreData属性动态命名和设置实体属性

时间:2012-05-11 04:02:27

标签: objective-c ios core-data

我正在开发一个函数来从我的网络服务中获取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)

    注意:我可以使用服务器端的一行代码轻松转换名称。所以,任何这些都很好,只是想做到正确,避免将来出现问题

  2. 如何动态设置值。我相信必须有办法做到这一点。我尝试了以下代码,但没有运气

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

  3. 注意:背后的原因是Web服务目前正在开发中,其数据库每天都在更新。

    修改

    找到问题2的解决方案

    [book performSelector:sel withObject:value];
    

    我要做的是以某种方式将author_id转换为setAuthor_id(或authorId转换为setAuthorId)。

1 个答案:

答案 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访问。