JSON to Core Data with Relationships

孤街浪徒 提交于 2019-12-03 10:14:55

问题


Following Ray Wenderlich's new tutorial I was able to get JSON data and store it into Core data. I am having a really hard time understanding how to do this with relationships in Core Data though.

Here is my Data Model:

Here is my JSON:

{
    "results": [
        {
        "name": "Trivia 1",
        "objectId": "1000",
        "createdAt": "2012-08-31 18:02:52.249 +0000",
        "updatedAt": "2012-08-31 18:02:52.249 +0000",
        "questions": [
            {
                "text": "Question 1"
            },
            {
                "text": "Question 2"
            },
            {
                "text": "Question 3"
            }
         ]
       }
     ]
}

And finally here is where I set the managedObject's Value:

    //Sets values for ManagedObject, also checks type
    - (void)setValue:(id)value forKey:(NSString *)key forManagedObject:(NSManagedObject *)managedObject {

        NSLog(@"TYPE: %@", [value class]);

        //If managedObject key is "createdAt" or "updatedAt" format the date string to an nsdate
        if ([key isEqualToString:@"createdAt"] || [key isEqualToString:@"updatedAt"]) {
            NSDate *date = [self dateUsingStringFromAPI:value];
            //Set date object to managedObject
            [managedObject setValue:date forKey:key];
        } else if ([value isKindOfClass:[NSArray class]]) {  //<---This would be the array for the Relationship
            //TODO: If it's a Dictionary/Array add logic here
            for(NSDictionary *dict in value){
                NSLog(@"QUESTION");
            }
        } else {
            //Set managedObject's key to string
            [managedObject setValue:value forKey:key];
        }
    }

I have taken a look at this question but I'm really confused how to connect the pieces together from the Ray Wenderlich examples. Any help would be greatly appreciated.


回答1:


In your for loop you are going to do some special handeling, if you're dealing with a QuestionGroup you will know that an array on that object is questions (assuming it is the only array) so you can create a new Question object for each entry in the dictionary. This is going to break the genericness of the sync engine but you could go through some extra steps to regain it if desired.

else if ([value isKindOfClass:[NSArray class]]) {
    if ([[managedObject entity] name] isEqualToString:@"QuestionGroup") {
        NSSet *questions = [NSMutableSet set];
        for (NSDictionary *question in value) {
            // create your question object/record
            NSManagedObject *questionManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Question" inManagedObjectContext:managedObjectContext];
            // setup your question object
            questionManagedObject.text = [question valueForKey:@"text"];
            // store all the created question objects in a set
            [questions addObject:questionManagedObject];
        }
        // assign the set of questions to the relationship on QuestionGroup
        [managedObject setValue:questions forKey:@"questions"];
    }
}



回答2:


I have used restkit in the past to handle this. I felt it was pretty heavy for what I was doing, but now that I'm working on another project that needs to solve the same problem, I'm not finding anything that will work better. I Guess its time to dust off restkit once again.

Have a look at http://restkit.org



来源:https://stackoverflow.com/questions/12223214/json-to-core-data-with-relationships

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!