【问题标题】:JSON to Core Data with RelationshipsJSON 到具有关系的核心数据
【发布时间】:2023-03-30 12:36:01
【问题描述】:

Ray Wenderlich's new tutorial 之后,我能够获取 JSON 数据并将其存储到核心数据中。不过,我很难理解如何处理 Core Data 中的关系。

这是我的数据模型:

这是我的 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"
            }
         ]
       }
     ]
}

最后这里是我设置 managedObject 的值:

    //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];
        }
    }

我查看了this question,但我真的很困惑如何将 Ray Wenderlich 示例中的各个部分连接在一起。任何帮助将不胜感激。

【问题讨论】:

    标签: iphone ios core-data one-to-many relationships


    【解决方案1】:

    在您的 for 循环中,您将进行一些特殊的处理,如果您正在处理 QuestionGroup,您将知道该对象上的数组是问题(假设它是唯一的数组),因此您可以创建一个新问题字典中每个条目的对象。这将破坏同步引擎的通用性,但如果需要,您可以通过一些额外的步骤来重新获得它。

    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】:

    我过去曾使用过 restkit 来处理这个问题。我觉得我正在做的事情非常繁重,但是现在我正在从事另一个需要解决相同问题的项目,我找不到任何可以更好地工作的东西。我想是时候再次清理restkit了。

    看看http://restkit.org

    【讨论】:

    • 其实我昨天才开始学习restkit。使用 Magical Record 让我有点困惑,我已经实现了自己的 AFNetworking 请求。我发现在线资源非常有用,但并不总是我需要的处理方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多