2014-01-19 4 views
1

У меня есть N классов основных объектов данных. У каждого класса свойства несколько разные.Создание универсального метода для всех классов ... возможно?

Я заполняю все сущности данными из файла . Первая строка файла содержит заголовок, который может быть как это:

code1,code2,code3,code4,ref1,ref2 

или может быть, как это

code1,code2,code3,ref1 

или другими словами, различное число «кода» и различным числом «ref»

Элементы этого заголовка имеют точное имя свойств основного объекта данных, который он представляет, и сущность имеет то же имя файла.

Пример:

  1. имя файла Cars.csv
  2. Cars.csv заголовок code1,code2,code3,ref1 имя
  3. Entity является Cars
  4. Cars объект имеет свойства code1, Кодекса2, code3 и реф.

Сказал, что это то, что я хочу.

У меня есть метод, который читает файл 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

Пришло время для заполнения базы данных после того, как объект создается с помощью волшебной команды 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]; 
+0

BRILLIANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! БЛАГОДАРЯ – SpaceDog

Смежные вопросы