如何在Objective C中使用托管对象?

时间:2018-03-28 11:18:05

标签: ios objective-c nsarray nspredicate nsfetchrequest

我得到了一个具有特定格式的字符串,该字符串具有实体名称:@" Entry"。我无法修改字符串。如何访问字符串?我可以访问数组对象,但不能访问内部。如何使用initWithEntityName?

这是字符串

<__NSArrayI 0x7fe093f87160>(
<Entry: 0x600000498c90> (entity: Entry; id: 30506398-1852-433D-B536-DC57F484F754> ; data: {
cumulativeTime = 0000;
latitude = “12.972442”
longitude = "77.580643";
type = enrty;
entryName = Bangalore;
}),
<Entry: 0x600000498c90> (entity: Entry; id: 30506398-1852-433D-B536- DC57F484F754> ; data: {
cumulativeTime = 0000;
latitude = “13.067439”
longitude = "80.237617";
type = enrty;
entryName = Chennai;
})

这就是我获得数组的方式。

+(NSArray*) routePlan
{
NSString* jsonString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Documents/DataJson" withExtension:nil]
                                                        encoding:NSUTF8StringEncoding error:nil];
NSArray* array = [jsonString componentsSeparatedByString:@","];


}

我需要使用谓词吗?

我需要latitude和logtude的值。我可以做&#34; po array [0]&#34;,但不能进入数组[0]。

如果我尝试访问纬度,请获取以下错误。

error: Execution was interrupted, reason: Attempted to dereference an invalid ObjC Object or send it an unrecognized selector.
The process has been returned to the state before expression evaluation.

如果我做po array [0],我得到了以下内容。

<__NSArrayI 0x7fe093f87160>(
<Entry: 0x600000498c90> (entity: Entry; id: 30506398-1852-433D-B536-DC57F484F754> ; data: {
cumulativeTime = 0000;
latitude = “12.972442”
longitude = "77.580643";
type = enrty;
entryName = Bangalore;
})

2 个答案:

答案 0 :(得分:0)

首先,您的文件不是json格式。 现在,当你这样做时:

NSString* aircraftJSONString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Documents/AircraftDataJson" withExtension:nil]
                                                        encoding:NSUTF8StringEncoding error:nil];
NSArray* aircraftJsonFplWaypoints = [aircraftJSONString componentsSeparatedByString:@","];

你实际上是用逗号分割你的文本,这就是你的aircraftJsonFplWaypoints包含2个对象的原因: 用值:

拳击一个字符串
  

&lt; __ NSArrayI 0x7fe093f87160&gt;((实体:条目;   id:30506398-1852-433D-B536-DC57F484F754&gt; ;数据:{cumulativeTime =   0000; latitude =“12.972442”经度=“77.580643”; type = enrty;   entryName =班加罗尔; })

然后是一个值为

的字符串
  

(entity:Entry; id:30506398-1852-433D-B536-   DC57F484F754&GT; ;数据:{cumulativeTime = 0000; latitude =“13.067439”   经度=“80.237617”; type = enrty; entryName = Chennai; })

您在aircraftJsonFplWaypoints中拥有的是字符串,而不是字典或数组。这将导致你无处可去。

您需要做的是使用正则表达式来获取{}中的内容。这应该有效:

  

{[^}] *}

所以我会做类似的事情:

    NSError * error;
    NSString * pattern = @"\\{[^\\}]*\\}";
    NSRegularExpression * regex = [[NSRegularExpression alloc] initWithPattern:pattern
                                                                       options:0
                                                                         error:&error];

    NSArray<NSTextCheckingResult *> * matches = [regex matchesInString:aircraftJSONString options:NSMatchingReportCompletion range:NSMakeRange(0, aircraftJSONString.length)];

    for(NSTextCheckingResult * match in matches)
    {
        NSString * substring = [aircraftJSONString substringWithRange:match.range];
        // Remove the bracket
        substring = [substring substringWithRange:NSMakeRange(1, substring.length - 2)];

        // split around the ";" => get the llat/long

        NSArray<NSString *>* parts = [substring componentsSeparatedByString:@";"];
        NSString * latLong = parts[1];

        /* continue to get the longitude and latitude */
    }
}

但我建议使用标准输入,例如,而不是复制/粘贴po输出,你可以使用NSJSONSerialisation API将对象序列化为json,这将使存储/检索更容易。

答案 1 :(得分:0)

您从捆绑文件中获取的数据似乎不是有效的JSON,而是其他内容。如果它是JSON数据,那么下面将是获得它的方法。

Entry

但正如您所提到的,ManagedObjectEntry,这意味着您正在尝试从核心数据中获取数据。因此,请确认我如何保存和从coredata获取数据。 (提供示例代码)。

如果您认为自己的方法正确,请尝试打印 +(NSArray*) routePlan { NSString* jsonString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Documents/DataJson" withExtension:nil] encoding:NSUTF8StringEncoding error:nil]; NSArray* array = [jsonString componentsSeparatedByString:@","]; [array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger index, BOOL * _Nonnull stop) { Entry* entry = (Entry*)obj; NSLog(@"id is :: %@",entry.id); NSLog(@"id is :: %@",entry.data); }]; return nil; } 对象属性。

|                name |                   email |
|---------------------|-------------------------|
|    Arturo     Vidal |     arturo.vidal@usm.cl |
|   Bastian   Quezada |          bastian@usm.cl |
|    Javier     Jeria |           javier@usm.cl |
| Sebastian    Piñera | sebastian@presidente.cl |
| Sebastian  Gallardo |        sebastian@usm.cl |