使用Reflection创建Core数据对象

时间:2014-10-07 10:48:34

标签: ios objective-c core-data reflection nsmanagedobject

我正在核心数据库中创建对象。我的方法是为每个托管对象创建一个类别,并拥有一个create方法。这工作正常。但是我有大约6个类,除了类名之外,代码几乎完全相同。

因此,我认为最好让一个类传递给正在创建的类的名称并使用:

 Class classType = NSClassFromString(className); 

这样我就可以访问该类类型了。

致电时;

  NSDictionary *attributes = [[classType entity] attributesByName];

我收到以下警告:

  

'实例方法'实体'用于'类',它不在根类'。

这是我的代码:

标题

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface GenericObjectCreation : NSManagedObject

+ (NSMutableDictionary *)createNewObjectWithData:(NSDictionary *)data
                                   className:(NSString *)className
                         inManagedObjectContext:(NSManagedObjectContext *)context;

@end

实施

#import "GenericObjectCreation.h"

@implementation GenericObjectCreation

+ (NSMutableDictionary *)createNewObjectWithData:(NSDictionary *)data
                                   className:(NSString *)className
                      inManagedObjectContext:(NSManagedObjectContext *)context
{
    Class classType = NSClassFromString(className);

    classType = nil;

    NSMutableDictionary *nexplanons = [NSMutableDictionary new];

    for (id key in data) {

        NSDictionary *element = [data objectForKey:key];

        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:className];
        request.predicate = [NSPredicate predicateWithFormat:@"organisationCode = %@", element[@"organisationCode"]];

        NSError *error = nil;
        NSArray *result = [context executeFetchRequest:request error:&error];

        if ([result count] > 0) {
            classType = result[0];
        }
        if (![result count]) {
           classType = [NSEntityDescription insertNewObjectForEntityForName:className inManagedObjectContext:context];
    }

        // Loop through attributes on
        NSDictionary *attributes = [[classType entity] attributesByName];
        for (NSString *attribute in attributes) {
            id value = [element objectForKey:attribute];
            if (value == nil) {
            continue;
        }
        [classType setValue:value forKey:attribute];
    }
    [nexplanons setObject:classType forKey:element[@"organisationCode"]];
}
[context save:nil];

return nexplanons;

}

@end

看起来这应该是可能的,并且会从我的项目中删除很多代码,这将是很好的。任何帮助将不胜感激。

作为一个附带问题,这被称为反思吗?

0 个答案:

没有答案