【问题标题】:Fetching entity attributes directly from coredata entity直接从 coredata 实体获取实体属性
【发布时间】:2017-10-26 06:58:40
【问题描述】:

我在 CoreData 中有一个名为 Devices 的实体。设备具有以下属性: 名称、型号、制造商、所有者。所有属性都是字符串类型。我正在使用以下代码使用谓词从实体设备中获取值

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Devices" inManagedObjectContext:self.managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

request.fetchLimit = Device_LIMIT;
NSSortDescriptor *sortDisc = [NSSortDescriptor sortDescriptorWithKey:@"model" ascending:YES];
[request setSortDescriptors:@[sortDisc]];
NSError *error;
NSArray *array = [self.managedObjectContext executeFetchRequest:request error:&error];   
if (array) {

    arrName = [array valueForKey:@"Name"];
}

return arrName;

我通过这种方式得到了想要的结果。但是,我的问题是如何直接从设备实体中获取名称属性的数组,而不添加任何 if-else 或 for in 条件。

【问题讨论】:

  • 想要的结果是什么?
  • 设备实体中名称属性下的所有值。
  • 您是否检查过array 是否拥有来自设备实体的所有记录?
  • 是的,它们来自设备实体。我只想知道核心数据是否有任何属性可以帮助替换 arrName = [array valueForKey:@"Name"];
  • 执行for循环将值添加到arrName

标签: ios objective-c core-data


【解决方案1】:

您需要从 Core Data 获取一个数组来获取这些值——这正是 Core Data 的工作原理。您可以更改您的代码以使用NSDictionaryResultType,但是您只会得到一个字典数组而不是托管对象数组。您所做的是正确的,如果不获取数组并从该数组中提取名称,则没有捷径可以获取名称值。

【讨论】:

  • 你是唯一真正理解我的问题的人。谢谢先生,我已经尝试使用 NSDictionaryResultType 和 setPropertiesToFetch 并得到了结果。但是我在使用之后有一个问题,是否可以获取关系属性也是这样吗?我的意思是,假设还有另一个实体 Person 和 Person 具有三个属性-年龄、工作、经验和 Device 与名为 cars 的汽车有一对多关系,那么我们也可以直接使用 setPropertiesToFetch 获取汽车的属性和 NSDictionaryResultType?
【解决方案2】:

执行 for 循环以将值添加到 arrName 为:

NSMutableArray *arrName = [NSMutableArray new];

for (NSManagedObject *object in array) {
    [arrName addObject:object[@"Name"]];
}

【讨论】:

    【解决方案3】:

    仅当获取请求失败并出现错误时才返回 nil 数组。

    您的代码的结构应该使得如果没有数组,您应该处理错误。

    编辑:对于大多数返回某些内容并将错误作为可可参数的方法来说,这是相当正确的。通常如果什么都没有返回,那么应该检查错误。

    【讨论】:

      【解决方案4】:

      executeFetchRequest方法的返回值是一个objects数组,所以必须使用for循环来取出name属性。

      【讨论】:

      • 他已经获得了没有for 循环的名称,因此显然不需要循环。
      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多