使用 NSArray 从 iOS 上的可转换核心数据创建对象

Posted

技术标签:

【中文标题】使用 NSArray 从 iOS 上的可转换核心数据创建对象【英文标题】:Creating an object from transformable core data on iOS using NSArray 【发布时间】:2013-09-12 13:08:36 【问题描述】:

我正在使用核心数据来检索一个可传输对象,然后将其保存为 NSArray,如下所示:

NSArray *bigDataResultsArray = [XAppDelegate.managedObjectContext executeFetchRequest:bigDataFetchRequest error:&error];
NSArray *bigDataResultsArrayJSON = [bigDataResultsArray valueForKey:@"bigData"];

我可以将 valueForKey 缩小为一个较小的对象数组,但它只显示为 1 个对象。

当我尝试从以下内容中提取“值”时,我收到错误,即它不符合值。数据格式如下,不会解析成JSON:

我尝试使用以下方法提取价值:

    NSArray *styleArray = [bigDataResultsArrayJSON valueForKey:@"Styles"];
    NSLog(@"%@", [styleArray valueForKey:@"Value"]);

这给出了一个错误。但是,如果我记录样式数组,我会得到以下信息“

(
            
        Total = 1;
        Value = 5;
    ,
            
        Total = 1;
        Value = "5.5";
    ,
            
        Total = 75;
        Value = 6;
    ,
            
        Total = 4;
        Value = "6.5";
    ,
            
        Total = 239;
        Value = 7;
    ,
            
        Total = 149;
        Value = "7.5";
    ,
            
        Total = 260;
        Value = 8;
    ,
            
        Total = 214;
        Value = "8.5";
    ,
            
        Total = 259;
        Value = 9;
    ,
            
        Total = 196;
        Value = "9.5";
    ,
            
        Total = 254;
        Value = 10;
    ,
            
        Total = 148;
        Value = "10.5";
    ,
            
        Total = 237;
        Value = 11;
    ,
            
        Total = 38;
        Value = 12;
    ,
            
        Total = 2;
        Value = 13;
    
)
)

谁能帮助我将这些数据的最后一层提取到一个值对象数组中。我尝试转换为 NSData 然后转换为 JSON 如下,但数据的格式不会解析:

NSData *raw = [[ra valueForKey:@"bigData"] dataUsingEncoding:NSUTF8StringEncoding]

非常感谢任何帮助。

【问题讨论】:

你到底想做什么?您想将数组存储在托管对象中而不创建新实体和设置新关系? “当我尝试提取“价值”时......” - 你到底尝试了什么? - "...并且不会解析为 JSON" - 你看过 NSJSONSerialization 吗? 您好,我已经更新了我的答案。我正在尝试从一个更大的数据对象中获取一组值项。我看起来像 NSJSONSerialization 但在将数组/str/data 传递给编码器时出错。提前致谢 @EHarpham:coloursArray 是什么?它没有在您的代码中定义。 (您确实复制/粘贴了真实代码,不是吗?) - 请展示您对 NSJSONSerialization 的尝试。 道歉。 coloursArray 应该是 stylesArray。已编辑代码。 【参考方案1】:

您可以从字典数组中提取一个只有一个字段的数组:

NSArray *dictArray = @[@"total" : @1, @"value" : @5,
  @"Total" : @1, @"Value" : @5.5, … ];
NSArray *resultsArray = [dictArray valueForKeyPath:@"value"];

---> @[@5, @5.5, …];

您可以对一组核心数据对象执行相同的操作:

// ... create the managed objects and fill their attributes
object.total = @1;
object.value = @5; 
// etc
NSArray *resultsArray = [fetchedObjects valueForKeyPath:@"value"];

---> @[@5, @5.5, …];

【讨论】:

感谢您。如果我不知道 dictArray 有多大,我将如何创建它? 使用NSMutableArray并循环调用addObject 我从核心数据中检索到的对象仅显示为 1 个对象,因此不确定我该怎么做。这是我原来的问题【参考方案2】:

您的 styleArray 是一个字典数组。数组没有键值对;数组的每个元素都可以。 Mundi 所说的是正确答案,并且会给你一个单一的值数组。

为了超级明确,你可以循环遍历 styleArray 的元素,并单独提取每个字典,也许这对你来说会更清楚。

NSArray *styleArray = [bigDataResultsArrayJSON valueForKey:@"Styles"];

NSMutableArray *valuesArray = [NSMutableArray array];
for (int i=0; i<styleArray.count; i++) 
    NSDictionary *styleDictionary = styleArray[i];
    id valueObj = [styleDictionary objectForKey:@"Value"];
    [valuesArray addObject:valueObj];


NSLog(@"Values: %@", valuesArray);

【讨论】:

以上是关于使用 NSArray 从 iOS 上的可转换核心数据创建对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?

从Objective C中的NSArray转换时如何比较String?

iOS开发UI篇—核心动画(关键帧动画)

IOS/Objective-C:按字符串中的单词数对 NSStrings 的 NSArray 进行排序

将 Mantle 与核心数据一起使用 - NSSet 和 NSArray

如何将带有对象数组的 json 字符串转换为带有 nsdictionaries 的 nsarray - IOS