1

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

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

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

编辑:

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

4

3 回答 3

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);
}
于 2013-10-31T14:20:14.867 回答
0

确实没有什么可以替代阅读 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 文档......

于 2013-10-31T14:15:44.933 回答
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];
}

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

于 2013-10-31T17:28:11.510 回答