0

我正在开发一个函数来从我的网络服务中获取 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 服务中使用相同的格式,会有什么问题吗?(作者 ID)

    注意:我可以在服务器端只用一行代码轻松转换名称。所以,这些都很好,只是想把它做好并避免未来的问题

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

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

注意:这背后的原因是网络服务目前正在开发中,它的数据库每天都在更新。

编辑

找到问题 2 的解决方案

[book performSelector:sel withObject:value];

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

4

1 回答 1

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

于 2012-05-11T04:37:56.803 回答