如何在Objective C中使用托管对象?
How to use managed object in Objective C?
我得到一个具有特定格式的字符串,它有一个实体名称:@"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:@","];
}
我需要使用谓词吗?
我需要纬度和经度的值。我可以 "po array[0]",但不能进入数组 [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;
})
首先,您的文件不是json格式。
现在,当你这样做时:
NSString* aircraftJSONString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Documents/AircraftDataJson" withExtension:nil]
encoding:NSUTF8StringEncoding error:nil];
NSArray* aircraftJsonFplWaypoints = [aircraftJSONString componentsSeparatedByString:@","];
您实际上是在逗号处拆分文本,这就是为什么您的 aircraftJsonFplWaypoints 包含 2 个对象:
拳头一个字符串值:
<__NSArrayI 0x7fe093f87160>( (entity: Entry;
id: 30506398-1852-433D-B536-DC57F484F754> ; data: { cumulativeTime =
0000; latitude = “12.972442” longitude = "77.580643"; type = enrty;
entryName = Bangalore; })
然后是值为
的字符串
(entity: Entry; id: 30506398-1852-433D-B536-
DC57F484F754> ; data: { cumulativeTime = 0000; latitude = “13.067439”
longitude = "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 */
}
}
但我建议使用输入标准,例如,而不是 copy/paste po 输出,您可以使用 NSJSONSerialisation API 将对象序列化为 json让 storing/retrieving 更容易。
您从捆绑文件中获取的数据似乎不是有效的 JSON,这是其他原因。如果它是 JSON 数据,那么下面将是获取该数据的方法。
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DataJson" ofType:@"json"];
NSLog(@"%@",filePath);
NSURL *url = [NSURL fileURLWithPath:filePath];
NSData *jsonData = [NSData dataWithContentsOfURL:url];
NSError *error = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&error];
if (error == nil){
NSLog(@"#### JSON object #### %@",jsonObject);
}else{
NSLog(@"#### JSON parsing error #### %@",error);
}
但是正如您提到的,您有一个 Entry
作为 ManagedObject
,这意味着您正在尝试从核心数据中获取数据。所以请确认你是如何从核心数据中保存和获取数据的。 (提供示例代码)。
如果您觉得自己的方法是正确的,请尝试打印 Entry
对象属性。
+(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;
}
我得到一个具有特定格式的字符串,它有一个实体名称:@"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:@","];
}
我需要使用谓词吗?
我需要纬度和经度的值。我可以 "po array[0]",但不能进入数组 [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;
})
首先,您的文件不是json格式。 现在,当你这样做时:
NSString* aircraftJSONString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Documents/AircraftDataJson" withExtension:nil]
encoding:NSUTF8StringEncoding error:nil];
NSArray* aircraftJsonFplWaypoints = [aircraftJSONString componentsSeparatedByString:@","];
您实际上是在逗号处拆分文本,这就是为什么您的 aircraftJsonFplWaypoints 包含 2 个对象: 拳头一个字符串值:
<__NSArrayI 0x7fe093f87160>( (entity: Entry; id: 30506398-1852-433D-B536-DC57F484F754> ; data: { cumulativeTime = 0000; latitude = “12.972442” longitude = "77.580643"; type = enrty; entryName = Bangalore; })
然后是值为
的字符串(entity: Entry; id: 30506398-1852-433D-B536- DC57F484F754> ; data: { cumulativeTime = 0000; latitude = “13.067439” longitude = "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 */
}
}
但我建议使用输入标准,例如,而不是 copy/paste po 输出,您可以使用 NSJSONSerialisation API 将对象序列化为 json让 storing/retrieving 更容易。
您从捆绑文件中获取的数据似乎不是有效的 JSON,这是其他原因。如果它是 JSON 数据,那么下面将是获取该数据的方法。
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DataJson" ofType:@"json"];
NSLog(@"%@",filePath);
NSURL *url = [NSURL fileURLWithPath:filePath];
NSData *jsonData = [NSData dataWithContentsOfURL:url];
NSError *error = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&error];
if (error == nil){
NSLog(@"#### JSON object #### %@",jsonObject);
}else{
NSLog(@"#### JSON parsing error #### %@",error);
}
但是正如您提到的,您有一个 Entry
作为 ManagedObject
,这意味着您正在尝试从核心数据中获取数据。所以请确认你是如何从核心数据中保存和获取数据的。 (提供示例代码)。
如果您觉得自己的方法是正确的,请尝试打印 Entry
对象属性。
+(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;
}