iOS核心数据 - 使用现有索引预填充数据库

时间:2012-04-30 18:33:53

标签: ios core-data indexing

我正在构建一个项目,我需要使用现有数据预先填充coredata数据库。

我构建了一个解析器来在iOS模拟器中创建sqlite文件,一切正常。 我正在使用单个实体,其中一个属性已编制​​索引。 将我的数据文件解析为核心数据后的性能非常好,一切都很好。

现在我在项目中使用生成的sqlite文件(~200Mb),具有相同的数据模型,相同的索引等...并且在第一次启动时我复制db文件以预填充数据

    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myproject" ofType:@"sqlite"];
    NSString *storePath = [[[self applicationDocumentsDirectory] path] stringByAppendingPathComponent: @"myproject.sqlite"];

    NSError *error;
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) 
    {
        if ([[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:&error])
            NSLog(@"Copied starting data to %@", storePath);
        else 
            NSLog(@"Error copying default DB to %@ (%@)", storePath, error);
    }

复制正常,数据可以正常访问。 然而,表现很糟糕,指数显然没有被使用 看一下复制操作后sqlite文件的大小,它从200Mb变为120Mb 在模型中一切看起来都没有问题,需要索引的内容被检查为索引
1)复制sqlite时是否有办法不删除索引数据?
2)是否可以以编程方式重建索引?
3)还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

检查Apple documentation about this issue

  

虽然Core Data支持SQLite作为其持久存储类型之一,但数据库格式是私有的。您无法使用本机SQLite API创建SQLite数据库并直接将其与Core Data一起使用(您也不应使用本机SQLite API操作现有的Core Data SQLite存储)。如果您有现有的SQLite数据库,则需要将其导入Core Data存储(请参阅“Efficiently Importing Data”)。

总结一下,不要这样做。数据库架构是私有的,可能会更改。

当应用程序首次启动时,我使用CSV文件将所有初始数据预加载到后台的CoreData。顺便提一下,请注意多线程CoreData访问。

希望它有所帮助。

答案 1 :(得分:0)

看起来问题是项目在测试之间没有得到很好的清理,这可能是我当时使用的Xcode 4.3中的一个错误。

现在,同样的方法工作正常。