如何使用 JSON 预加载一对多核心数据关系

Posted

技术标签:

【中文标题】如何使用 JSON 预加载一对多核心数据关系【英文标题】:How to pre-load One to Many Core data relationship using JSON 【发布时间】:2013-08-01 16:40:47 【问题描述】:

我已经按照这个教程http://www.raywenderlich.com/12170/core-data-tutorial-how-to-preloadimport-existing-data-updated

我现在用来指导并创建了我自己的应用程序,我有两个实体并因为我的实体具有一对多的关系而陷入困境。

Make(属性:carMake) 型号(属性:carModel)

每个品牌都有许多模型。 (一对多关系定义为(模型))。

我也将逆向设置为“make”。

我有两个问题,首先,您将如何在 JSON 文件中填充数据,如下所示?以汽车为数据模型名称。

[ "cars": 
           "carMake": "BMW", 
           "models": [ 
                      "carModel": "1 Series" 
                      "carModel": "3 Series" 
                       "carModel": "4 Series"  
                     ] 
           "carMake": "Audi", 
           "models": [ 
                      "carModel": "A4" 
                      "carModel": "A3" 
                     ] 
          
] 

其次,我如何通过 xcode 将这些数据转换为 sqlite 数据库,就像在 Rays 教程中一样,他没有说明如何为一对多关系执行此操作。

提前感谢大家回复。

以下是用于将数据从 JSON 文件预填充到 SQLITE 的代码:

[Banks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    FailedBankInfo *failedBankInfo = [NSEntityDescription
                                  insertNewObjectForEntityForName:@"FailedBankInfo"
                                  inManagedObjectContext:context];
    failedBankInfo.name = [obj objectForKey:@"name"];
    failedBankInfo.city = [obj objectForKey:@"city"];
    failedBankInfo.state = [obj objectForKey:@"state"];
    FailedBankDetails *failedBankDetails = [NSEntityDescription
                                          insertNewObjectForEntityForName:@"FailedBankDetails"
                                        inManagedObjectContext:context];
    failedBankDetails.closeDate = [NSDate dateWithString:[obj objectForKey:@"closeDate"]];
    failedBankDetails.updateDate = [NSDate date];
    failedBankDetails.zip = [obj objectForKey:@"zip"];
    failedBankDetails.info = failedBankInfo;
    failedBankInfo.details = failedBankDetails;
    NSError *error;
    if (![context save:&error]) 
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    
];

【问题讨论】:

这对你来说仍然是真实的吗?如果是,您能否使用用于一对一关系的代码更新您的问题(我想,这是整个工作的一部分,您确实了解如何从教程中处理),以便可能的受访者能够理解您的具体情况上下文。 是的,这个问题仍然存在。我将一对一发布教程中使用的代码。 在我详细回答之前,能否请您也发布一下:Make的哪个字段负责存储价值“BMW”? Model 的哪个字段负责存储“1 系列”之类的值? 如果您想尽快得到您的问题的答案,而无需编写一大堆 cmets,请随时通过 Skype 与我联系(请参阅我的个人资料)。如果您不害怕与“其中一个俄罗斯人”联系,我愿意为您提供帮助。此评论仅供您参考。我将在一个小时左右将其删除,以免在本主题中产生离题的噪音。 BMW 存储在实体“Make”中“string”类型的属性“carMake”中。同样,1 系列存储在实体“模型”中“字符串”类型的属性“汽车模型”中。 【参考方案1】:

我是这样做的:

 NSError* err = nil;
 NSArray *jsonArray = [[NSArray alloc] init];
 NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Words" ofType:@"json"];
 jsonArray = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
                                              options:kNilOptions
                                                error:&err];
NSManagedObjectContext *context = [self managedObjectContext];

[jsonArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
        WordEntity *word = [NSEntityDescription
                            insertNewObjectForEntityForName:@"WordEntity"
                            inManagedObjectContext:context];

word.greekText = [obj objectForKey:@"greektext"];
word.englishText = [obj objectForKey:@"englishtext"];
word.uid = [NSString stringWithFormat:@"%@", [obj objectForKey:@"uid"]];
word.category = [obj valueForKey:@"category"];


        NSError *error;
        if (![context save:&error]) 
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        
    ];

【讨论】:

以上是关于如何使用 JSON 预加载一对多核心数据关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Objective-C 将一对多关系数据保存到核心数据中

如何在一对多核心数据关系中获取特定数据?

需要一些有关如何使用新的一对多关系设置核心数据迁移的信息

如何在核心数据中以一对多关系链接现有值?

如何保持对象一对多 RestKit

使用具有一对多关系的 JPA 映射实体,如何添加连接条件