制作一个适合所有类的通用方法......这可能吗?

Posted

技术标签:

【中文标题】制作一个适合所有类的通用方法......这可能吗?【英文标题】:Making a generic method to fit all classes... is that possible? 【发布时间】:2014-01-19 09:23:32 【问题描述】:

我有 N 类核心数据实体。每个类的属性都略有不同。

我正在使用来自 CSV 文件的数据填充所有实体。文件的第一行包含标题,可能是这样的:

code1,code2,code3,code4,ref1,ref2

或者可能是这样的

code1,code2,code3,ref1

或者换句话说,不同数量的“code”和不同数量的“ref”

此标头的元素具有它所代表的核心数据实体的属性的确切名称,并且实体与文件具有相同的名称。

例子:

    文件名为Cars.csv Cars.csv 标头是 code1,code2,code3,ref1 实体名称是Cars Cars 实体具有属性 code1、code2、code3 和 ref。

说了,这就是我想做的。

我有一种方法可以逐行读取 csv 文件,并将用于填充数据库。到目前为止的方法是这样的:

- (void) populateDatabaseEntityFromFile:(NSString *)fileName 


  // all lines of the file are stored on array
  NSArray* allLines = [self readAllLinesOfFile:fileName];

  //get the header
  NSString *firstLine = [linhas objectAtIndex:0];
  NSArray *header = [firstLine componentsSeparatedByString: @","];


  // iterate over all lines... start with i=1 to ignore the header
  for (int i=1; i<[allLines count]; i++)  

    NSString *oneLine = [allLines objectAtIndex:i];
    NSArray *valuesOnLine = [oneLine componentsSeparatedByString: @","];

    // MAGIC COMMAND 1 HERE
    // insert a new object on a core data entity


    // iterate over the values of a line
    for (int i=0; i<[header count]; i++) 

      NSInteger oneValue = [[valuesOnLine objectAtIndex:i] integerValue];
      NSString *oneProperty = [header objectAtIndex:i];


      // MAGIC COMMAND 2 HERE, to populate the entity


    


我所说的魔术命令 1 和 2 的意思是:

魔法命令 1

此时我需要在实体上插入一个新对象。

如果这是硬连线到特定实体,我会这样做

Entity1 *newObj = [Entity1 insertNewObjectImManagedObjectContext:self.managedObjectContext];

但我无法将它硬连线到 Entity1。我需要一些通用的东西,例如:

"entity that has the same name as fileName" *newObj = ["entity that has the same name as fileName" insertNewObjectImManagedObjectContext:self.managedObjectContext];

魔法命令 2

是时候填充数据库了,一旦通过魔术命令1创建了实体,我就可以了

[newObj setValue:@(oneValue) forKey:oneProperty];

那么,我该如何执行那个神奇的命令 1?

【问题讨论】:

【参考方案1】:

“动态”创建托管对象(无需将其硬连接到特定的 实体),你可以这样做:

NSString *entity = @"Car";
NSEntityDescription *desc = [NSEntityDescription entityForName:entity inManagedObjectContext:self.managedObjectContext];
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:desc insertIntoManagedObjectContext:self.managedObjectContext];

要动态设置键和值,以下应该可以工作:

NSArray *header = ...; // The attribute names from your header line
NSArray *valuesOnLine = ...; // The corresponding attribute values 
NSDictionary *dict = [NSDictionary dictionaryWithObjects:valuesOnLine forKeys: header];
[object setValuesForKeysWithDictionary:dict];

【讨论】:

以上是关于制作一个适合所有类的通用方法......这可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

想要使用 chrome 控制台单击具有特定类的所有按钮。这可能吗?

静态库的创建和使用,制作通用静态库

你可以捆绑一个 Objective-C iPhone 应用程序和一个 HTML5 (PhoneGap) iPad 应用程序来制作一个通用应用程序吗?

为任何通用父类定义的子类[重复]

通用应用Splitviewcontroller

制作一个单一的按钮睡眠/唤醒 Windows 10 [关闭]