获取属性的名称而不是值

时间:2013-10-31 14:04:52

标签: ios core-data

我正在使用核心数据,并且一直在使用这样的代码:

[self.form setValue:self.comments.text forKey:@"comments"];

我想将这样的代码放入循环中,我的所有coredata名称都与属性名称相同。我怎么能说forKey:self.comments.name并得到与上面相同的结果或类似的东西?

编辑:

如果这是不可能的,还有另一种方法可以从属性中将大量的值设置为coredata吗?我有50多个属性和属性都需要设置,并且希望避免使用我现在正在做的事情。

3 个答案:

答案 0 :(得分:3)

如果你真的想要它,你可以使用objc / runtime.h中的这些函数:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) // To get properties declared by a class.
const char *property_getName(objc_property_t property) // To get the name of one property

这样的事情:

unsigned int propCount = 0;
objc_property_t *properties = class_copyPropertyList([self class], &propCount);

for(int idx = 0; idx < propCount; idx++) {
    objc_property_t prop = *(properties + idx);
    NSString *key = @(property_getName(prop));
    NSLog(@"%@", key);
}

答案 1 :(得分:0)

reading the docs on CoreData确实没有替代品,因为如果没有一点小小的工作,使用模式和语法就不会很明显。

也就是说,您通常从数据存储中获取NSManagedObject子类的实例:

NSManagedObjectContext* moc = [delegate managedObjectContext];
NSEntityDescription* description = [NSEntityDescription entityForName:@"Filter" inManagedObjectContext:moc];
NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:description];
[request setSortDescriptors:[NSArray arrayWithObject:descriptor]];
NSError *error;
_enabledFilters = [NSMutableArray arrayWithArray:[moc executeFetchRequest:request error:&error]];
if (error) {
    NSLog(@"%@",error.localizedDescription);
}

在这个例子中,我现在有一个名为“Filter”的NSManagedObject实例数组

然后,您可以选择要引用的相应实例,并使用简单的点语法访问所有属性。

Filter* thisFilter = (Filter*)[_displayFilters objectAtIndex:indexPath.row];
cell.label.text = thisFilter.name;
cell.label.backgroundColor = [UIColor clearColor];
NSString*targetName = thisFilter.imageName;
UIImage *image = [UIImage imageNamed:targetName];
cell.image.image = image;

现在我从持久数据存储中获取信息,并在我的应用程序中使用它。

另一种方式是写入数据存储中的实例只是略有不同,因为你直接设置了NSManagedObject子类实例的属性,然后在上下文中调用save来推送任何实例。改变到商店。

TL; DR - 你有责任花一两个小时与CoreData文档...

答案 2 :(得分:0)

一种方法是自己声明属性数组。

NSArray *attributes = [NSArray arrayWithObjects:..., @"comments", .., nil]; // or a NSSet
for(NSString *attribute in attributes){
    NSString *text = [[self performSelector:NSSelectorFromString(attribute)] text]; // presuming that it's safe to call 'text' on all your properties
    [self.form setValue:text forKey:attribute];
}

如果您想要核心数据模型的所有属性,也可以使用this