我正在为iPad应用程序编写数据导入例程。它似乎工作正常。但是,因为我是一个IOS菜鸟,来自应用程序开发背景,通过调用SQL服务器来处理这些任务,我觉得需要仔细检查我是否使用了正确的方法。
以下是我用于将数据导入我的一个主数据实体的基本方法:
// SET UP SOME VARIABLES/VALUES APPLICABLE TO ALL IMPORTS
NSStringEncoding encoding = 1;
NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
NSString* file = nil;
NSError* error = nil;
NSArray* records = nil;
NSArray* fields = nil;
NSPredicate* predicate = nil;
NSArray* filteredArray = nil;
// IMPORT GEO DATA
// ProvinceState
file = [[NSBundle bundleForClass:[self class]] pathForResource:@"ProvinceState" ofType:@"txt"];
error = nil;
records = [NSArray arrayWithContentsOfCSVFile:file usedEncoding:&encoding error:&error];
NSManagedObject* provinceState = nil;
NSMutableArray* provinceStateArray = [NSMutableArray arrayWithCapacity:[records count]];
for (int i = 0; i < [records count]; ++i)
{
fields = [records objectAtIndex:i];
if ([fields count] == 2)
{
provinceState = [NSEntityDescription insertNewObjectForEntityForName:@"ProvinceState" inManagedObjectContext:self.managedObjectContext];
[provinceState setValue: [numberFormatter numberFromString:[fields objectAtIndex:0]] forKey:@"id"];
[provinceState setValue:[fields objectAtIndex:1] forKey:@"name"];
[provinceStateArray addObject:provinceState];
}
}
几个关键点。这个特定的实体非常简单 - 只是一个整数id和一个字符串名称。它的源表是一个简单的csv文件。方法arrayWithContentsOfCSVFile:usedEncoding:error:
来自Dave Delong优秀的CHCSV解析器,它使解析变得轻而易举。我还没有应用任何错误处理,因为我正在尝试首先解决基本技术。
好的,除非你发现这个简单的代码有任何问题,否则我现在继续讨论我的主要问题。在上面代码的最后一个有意义的行中引用的provinceStateArray是为了节省自己以后必须查询主数据实体的麻烦,当我需要将它们填充到我的事务数据的关系中时。我意识到这一点a)增加了我的内存需求和b)通过暗示阻止我排出相关的自动释放池,但由于大约六个主数据实体总共只包含几百个小对象,我没想到这是一个问题。有人有不同的想法吗?
现在关注我的部分。在下面的代码中,填充了Locations实体,我使用了这些相同的主数据实体数组,如下所示:
file = [[NSBundle bundleForClass:[self class]] pathForResource:@"Location" ofType:@"txt"];
error = nil;
records = [NSArray arrayWithContentsOfCSVFile:file usedEncoding:&encoding error:&error];
NSManagedObject* location = nil;
NSMutableArray* locationArray = [NSMutableArray arrayWithCapacity:[records count]];
for (int i = 0; i < [records count]; ++i)
{
NSArray* fields = [records objectAtIndex:i];
if ([fields count] == 5)
{
location = [NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:self.managedObjectContext];
[location setValue: [numberFormatter numberFromString:[fields objectAtIndex:0]] forKey:@"id"];
predicate = [NSPredicate predicateWithFormat:@"id = %@", [numberFormatter numberFromString:[fields objectAtIndex:1]]];
filteredArray = [provinceStateArray filteredArrayUsingPredicate:predicate];
if ([filteredArray count] > 0)
{
[location setValue:[filteredArray objectAtIndex:0] forKey:@"provinceState"];
}
......依此类推,必须设置的其他关系实体。
这是一个部分 - 必须构建大量的对象只是为了设置关系 - 这对我来说很陌生,即使我没有看到任何替代方案。
另外,因为源数据来自RDBMS,所以我填充了一对多关系的一边而不是遍历集合。
所有这些都有什么味道不好,或者我可以继续享受一些我理解的安慰吗?
答案 0 :(得分:0)
我认为最好创建SQLite数据库,将其导入项目并将数据从文件导入到该数据库(它是硬盘驱动器内存),而不是RAM中的数组。然后,当您的数据库可以使用时,请对其进行查询,以便仅将用户所需的数据填充到iPhone RAM中。