制作一个适合所有类的通用方法......这可能吗?
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 应用程序来制作一个通用应用程序吗?