2

我有一个方法,它将我的 sqlite 数据库中的实体名称作为字符串,我试图简化它以使用尽可能少的重复代码。

在这里,我有实体作为 id,我试图将其设置为需要的对象类型,以准备调用插入行。

问题是当我调用 NSEntityDescription 实体仍然是类 id

  id entity;

if ([entityName isEqualToString:@"yadda yadda"]) {

    entity = [EntityYadda class];
}
else if ([entityName isEqualToString:@"blah blah"]) {

    entity = [EntityBlah class];
}
else if ([entityName isEqualToString:@"Foobar"]) {

    entity = [EntityFoobar class];
}

for (int x=0; x<[data count]; x++) {

    entity = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];

我哪里错了?

谢谢

4

3 回答 3

1

我有 7 个不同的实体,它们都具有相同的字段,所以我试图将所需的实体类动态分配给“实体”,所以在我的循环中,我将只有一行使用 NSEntityDescription 属性设置。

好吧,您已经想到“为什么不使用一个带有表示类型的标志字段的实体?”,这是一个很好的问题,我非常建议您采用这条路线。

如果由于某种原因不能,您可以在协议中声明相同的字段,然后声明这 7 个实体都符合相同的协议。在您的方法中,您的类型声明将是(而不是idNSManagedObject<MyCustomProtocol> *:。

于 2011-07-01T15:16:17.373 回答
0

你为什么不创建一个typedef:

typedef enum {

EntityTypeYaddaYadda,
EntityTypeBlahBlah,
    EntityTypeFoobar

} EntityType;

然后执行切换:

for (int x=0; x<[data count]; x++) {

switch (entity.entityType){
case EntityTypeYaddaYadda:
{
YaddaYadda *yaddaYaddaObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
... set properties...
}
break;

case EntityTypeBlahBlah:
{
BlahBlah *blahBlahObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
... set properties...
}
break;

case EntityTypeFoobar:
{
Foobar *foobarObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
... set properties...
}
break;
}

然后保存您的上下文:

if (![managedObjectContext save:&error]) {
NSLog(@"Error while saving.");
}

有时需要一些代码重复才能使其具有可读性和可扩展性。

于 2011-07-01T13:46:52.273 回答
0

我不是专家,但据我所知,只有两种声明变量的方法:

  1. 使用静态类型(当您声明变量的类型时:UIView *myview)
  2. 使用动态类型(当您使用“id”声明变量时:id myObject)

在第一种情况下,类型在编译时就知道了,编译器将执行一系列检查以确保代码的一致性。在第二种情况下,直到运行时才知道类型。无论如何,一旦定义了变量的类型(使用id或特定的类名),就无法重新定义它。

无论如何,您都可以使用NSSClassFromString()动态分配类,避免使用长 if/else 或 switch 语句。

此外,您可以(应该)使用像 respondsToSelector:(SEL) 这样的工具来确保您可以安全地向班级发送消息

于 2011-07-01T15:17:32.997 回答