IOS数据导入策略/设计

时间:2011-07-16 07:34:36

标签: ios core-data import

我正在为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,所以我填充了一对多关系的一边而不是遍历集合。

所有这些都有什么味道不好,或者我可以继续享受一些我理解的安慰吗?

1 个答案:

答案 0 :(得分:0)

我认为最好创建SQLite数据库,将其导入项目并将数据从文件导入到该数据库(它是硬盘驱动器内存),而不是RAM中的数组。然后,当您的数据库可以使用时,请对其进行查询,以便仅将用户所需的数据填充到iPhone RAM中。