typ*_*ror 18 core-data objective-c ios
如果我有一个从上下文中获取的NSManagedObject,如何从动态属性中创建一个NSDictionary,而不是只显式地将每个字段复制到字典中?
如果我的托管对象看起来像这样,例如:
@implementation Track
@dynamic artist;
@dynamic group;
@dynamic purchase_url;
@dynamic title;
@dynamic file_name;
@dynamic year;
@end
Run Code Online (Sandbox Code Playgroud)
从数据库中取出后,在这种情况下,我需要一个NSDictionary,其中每个@dynamic属性都设置了相同的属性.
小智 55
有一种更快的方法可以将NSManagedObject转换为NSDictionary(来自Matthias Bauch的响应,请访问/sf/answers/396532181/):
NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
Run Code Online (Sandbox Code Playgroud)
Mar*_*kus 10
您可以通过以下方法实现您的方法:
unsigned int count;
objc_property_t *properties = class_copyPropertyList([CoreDataObject class], &count);
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:16];
for(int i = 0; i < count; i++) {
objc_property_t property = properties[i];
NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
id obj = [coreDataObjectInstance valueForKey:name];
if (obj) {
// Skip properties with nil values (optionally you can use: [dictionary setObject:((obj == nil) ? [NSNull null] : obj) forKey:name]; without any if-statement)
[dictionary setObject:obj forKey:name];
}
}
free(properties);
Run Code Online (Sandbox Code Playgroud)
"CoreDataObject"是您希望转换为NSDictionary的核心数据对象,而"coreDataObjectInstance"是此核心数据对象的实例.请记住,您必须:
#include <objc/runtime.h>
Run Code Online (Sandbox Code Playgroud)
此外,如果您能够通过这个想法为我们提供更多见解,那将会很棒,也许有一个不同的/更好的解决方案.
希望这可以帮助!
我认为这正是你真正想要的:
NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];
Run Code Online (Sandbox Code Playgroud)
然后你可以访问这些词典:
[trackEntity propertiesByName];
[trackEntity relationshipsByName];
[trackEntity attributesByName];
Run Code Online (Sandbox Code Playgroud)
这些词典中的每一个都将具有与该属性相对应的键,并且该值将是NSPropertyDescription.
| 归档时间: |
|
| 查看次数: |
13010 次 |
| 最近记录: |