如何计算/遍历NSManagedObject具有的所有属性?

时间:2012-10-17 02:37:16

标签: ios uitableview core-data attributes

我将NSManageObject设置为核心数据中的实体。获取实体后,我希望能够提取所有属性并将它们放入NSMutableArray中以使用。填充UITableView。

例如: 实体: 项目

属性: startDate(必填); finishDate(可选); PROJECTNAME(需要);等....

如何将所有这些内容添加到NSMutableArray中?或者有更好的方法来填充UITableView吗?

3 个答案:

答案 0 :(得分:7)

您可以通过向NSEntityDescription询问NSAttributeDescription个对象来获取此信息:

NSManagedObject *object = ...;
NSEntityDescription *entity = [object entity];
NSDictionary *attributes = [entity attributesByName];

NSMutableArray *values = [NSMutableArray array];
for (NSString *attributeName in attributes) {
  id value = [object valueForKey:attributeName];
  if (value != nil) {
    [values addObject:value];
  }
}

注意:这只包含属性,而不包含关系。如果您只想要关系值,可以使用-relationshipsByName。如果您同时需要属性和关系,则可以使用-propertiesByName

决定这是否是一个好主意留给读者练习。

答案 1 :(得分:0)

修改

只需向实体添加一个返回非空属性数组的方法:

- (NSMutableArray*)nonNullAttributes {
    NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:0];

    //Pretend you have an attribute of startDate
    if (startDate && startDate != null) {
        [mutableArray addObject:startDate]
    }

    //Do this for all of your attributes.
    //You might want to convert the attributes to strings to allow for easy display in the tableview.

    return mutableArray;
}

您可以在NSManagedObject子类中添加它。然后,您可以使用数组的计数来了解要拥有的行数。

原始回答

为什么甚至打扰将属性放入数组?只需在填充tableview时直接从Entity访问它们。

答案 2 :(得分:0)

你不能只用executeFetchRequest来获取阵列吗?

NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Project"    
                                   inManagedObjectContext:someContext];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [someContext executeFetchRequest:fetchRequest error:&error];