【问题标题】:insert NSDictionary into CoreData将 NSDictionary 插入 CoreData
【发布时间】:2012-01-30 17:24:20
【问题描述】:

我有一个 NSDictionary 和一个 CoreData 数据库。我想将 NSDictionary 插入到数据库中。

  1. 我该怎么做(如果可能,代码 sn-ps)?

  2. 字典的属性适合什么类型?

【问题讨论】:

  • 那么您是想将字典作为 Core Data 对象插入(即从中创建一个 NSManagedObject),还是在 Core Data 中有一些实体并希望字典作为它的属性?跨度>
  • 是的,我想将字典作为核心数据对象插入

标签: iphone objective-c core-data nsdictionary


【解决方案1】:

您需要将 NSDictionary 序列化为 NSData,CoreData 可以保存到 NSData。
但是您将无法搜索 NSDictionary 的(谓词)元素。

如果我们考虑这一点,NSDictionary 就是一个数据集合。
数据库中的表是一种数据集合。
在 CoreData 中,最接近数据集合的是 NSManagedObject。

所以我的建议是创建一个 NSManagedObject 子类来保存您在 NSDictionary 中的信息。 key 将是属性,值将是该属性的value。并且您将能够根据该 NSManagedObject 子类的属性进行搜索。

【讨论】:

  • VinceBurn 首先我想感谢你的回答,其次我想告诉你我从你的解决方案中逃脱到 NSDictionary 因为我从一个巨大的 XML 文件中接收到数据所以我想使用动态的方式来填写数据
  • @OXXY - 不客气。我不确定我是否在关注您,如果您的 XML 文件很大,您可以将其解析为一个或 2 或 3 个不同的 NSManagedObject 子类。根据您的 XML 的内容,您可以修改您的操作。这样你就可以查询它。如果您不需要查询它,您可以将该文件直接保存到磁盘,并将 URL 存储在核心数据对象中,这与将其存储为 NSData 几乎相同。如果一次只有一个,请不要使用核心数据进行持久化。我不确定你的架构是什么,所以我可能不合时宜。
  • 我提出了一个关于解析XML并将其存储在数据库中的问题,也许它会帮助你关注我stackoverflow.com/questions/8518884/…
【解决方案2】:

我找到了另一种将字典添加到 Coredata 的方法,方法是创建数据类型为“可转换”的属性。

例如,在您的项目和属性中创建一个数据类型为可转换的实体。 为 NSManagedObject 生成子类。属性将可用于数据类型“id”,更改为 NSDictionary。

以下是我所做的(我的 NSManagedObject 子类名称是 'DictTest')

-(void)InsertIntoDataBase
{
    DictTest *entityDict=(DictTest*)[NSEntityDescription insertNewObjectForEntityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext];
    NSMutableDictionary *mutDict=[NSMutableDictionary dictionary];
    [mutDict setValue:@"1" forKey:@"1"];
    [mutDict setValue:@"2" forKey:@"2"];
    [mutDict setValue:@"3" forKey:@"3"];
    [mutDict setValue:@"4" forKey:@"4"];
    [mutDict setValue:@"5" forKey:@"5"];
    [mutDict setValue:@"6" forKey:@"6"];
    [mutDict setValue:@"7" forKey:@"7"];
    [mutDict setValue:@"8" forKey:@"8"];
    [mutDict setValue:@"9" forKey:@"9"];
    [mutDict setValue:@"10" forKey:@"10"];
    [entityDict setInfoDict:mutDict];
    NSError *error;
    if(![self.managedObjectContext save:&error])
    {
        NSLog(@"error description is : %@",error.localizedDescription);
    }
    else{
        NSLog(@"Saved");

    }
}

用于获取记录

-(void)FetchRecord
{
    NSFetchRequest *request=[[NSFetchRequest alloc]init];
    NSEntityDescription *entity=[NSEntityDescription entityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];
     NSArray *fetchArray=  [self.managedObjectContext executeFetchRequest:request error:nil];
    for (DictTest *obj in fetchArray) {
        NSLog(@"Dict is : %@",obj.infoDict);
    }
}

【讨论】:

    【解决方案3】:

    设置你的实体描述,插入一个新对象,然后使用:

    [managedObject setValuesForKeysWithDictionary:dict];
    

    【讨论】:

    • 注意,这要求实体描述在使用该方法时不能有缺失的部分——见cimgf.com/2011/06/02/saving-json-to-core-data——“在该方法中,字典中包含的键决定了在托管对象上使用哪些键. 但是如果字典包含一个不属于实体描述的键怎么办?然后你的应用程序崩溃,并显示对象如何不符合键的键值编码的错误。在这里使用这种方法会使你的应用程序的稳定性受到摆布您正在使用的网络服务。”
    【解决方案4】:

    您为什么不使用 NSDictionary 中的所有数据创建一个实体,然后对其进行解析。

    检查this out for some CoreData code snippets. 您可以简单地创建一些实体来存储您的字典信息。然后,您可以解析字典并保存正确的属性:

     NSManagedObject *photoObject = [NSEntityDescription insertNewObjectForEntityForName:@"Photo"
                                                                  inManagedObjectContext:context];    
     [photoObject setPhotographer:[myDictionary objectForKey:@"photographer"]];
     and so on...
    

    无论您的 XML 数据结构多么复杂,如果您可以设置一个不错的实体结构,那么在 CoreData 中简单地把它全部简化是相当容易的。如果您花时间创建实体而不是将整个字典转储到单个字段中,那么您的查询也会更轻松。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多