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

时间:2014-01-19 09:23:33

标签: ios iphone ipad cocoa-touch

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

我使用CSV文件中的数据填充所有实体。该文件的第一行包含标题,可能如下所示:

code1,code2,code3,code4,ref1,ref2

或者可能是这样的

code1,code2,code3,ref1

或换句话说,不同数量的“代码”和不同数量的“ref”

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

示例:

  1. 文件名为Cars.csv
  2. Cars.csv标题为code1,code2,code3,ref1
  3. 实体名称为Cars
  4. Cars实体具有属性code1,code2,code3和ref。
  5. 说,这就是我想要做的。

    我有一个逐行读取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的含义是:

    MAGIC COMMAND 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];
    

    MAGIC COMMAND 2

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

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

    那么,我该怎么做那个魔术命令1?

1 个答案:

答案 0 :(得分: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];