0

我正在构建一个利用核心数据的应用程序,它在数据模型中有多个实体。我想做的是创建一个方法,该方法能够根据它接收到的方法的名称创建适当的 NSManagedObject 子类,这将是一个 NSString。

我的方法如下所示:

- (NSManagedObject *) addEntity:(NSString *)name {

  NSManagedObjectContext *context = [self managedObjectContext];
  NSError *error;

  //need to add a line here that casts EntityType to of type "name" which is passed into the method.
  EntityType *testEntity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];

  [context save:&error];

   return testEntity;

}

其中“EntityType”是“name”类型,这样如果我将名称“Manager”传递给方法,我将创建一个“Manager”类型的对象。因此上面的行:

EntityType *testEntity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];

会读:

Manager *testEntity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];

为了根据传递给方法的类型动态创建实体,我需要做什么?请注意,我这样做是因为我的应用程序中有超过 20 个实体,并且希望只有一种方法可以用于其中任何一个。

4

1 回答 1

0

如果您的问题是testEntity只使用泛型的类型NSManagedObject

无论如何,一个不错的解决方案是在NSManagedObject. 这是一个基本上复制了 MagicalRecord 提供的相同功能的实现。

NSManagedObject+Utilities.h

@interface NSManagedObject (Utilities)
+ (instancetype)my_createAndSave:(NSError **)error;
@end

NSManagedObject+Utilities.m

@implementation NSManagedObject (Utilities)
+ (instancetype)my_createAndSave:(NSError **)error {
    NSString *entityName = NSStringFromClass(self);
    if ([self respondsToSelector:@selector(entityName)]) {
        entityName = [self performSelector:@selector(entityName)];
    }
    NSManagedObject *entity = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
    [self.managedObjectContext save:error];
    return entity;
}
@end

几点说明:

  • 命名

    • 作为一个类别总是最好添加一个自定义前缀,而不是与 Apple 的 API 冲突。我my_在这里使用过,但你可以添加任何你喜欢的东西。
    • 以方法名称开头的方法new应保留给返回非自动释放对象的方法。由于entity是自动释放的,ARC 将在返回对象之前添加一个额外retain的(稍后由 a 平衡release)(参考)。虽然这不是问题,但它违反了标准命名约定,应该避免。
  • 错误处理

    • 您应该产生错误或正确处理它。我选择在我的实现中将错误传递回调用者
于 2013-10-23T18:25:25.420 回答