我正在使用核心数据,并且一直在使用这样的代码:
[self.form setValue:self.comments.text forKey:@"comments"];
我想将这样的代码放入循环中,我的所有coredata名称都与属性名称相同。我怎么能说forKey:self.comments.name
并得到与上面相同的结果或类似的东西?
编辑:
如果这是不可能的,还有另一种方法可以从属性中将大量的值设置为coredata吗?我有50多个属性和属性都需要设置,并且希望避免使用我现在正在做的事情。
答案 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。