iOS CoreData – 用现有索引预填充数据库

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

我build立了一个parsing器来创buildiOS模拟器中的sqlite文件,一切工作正常。 我正在使用一个实体,并且其中一个属性被索引。 将我的数据文件parsing为核心数据后的性能非常好,一切都很好。

现在我正在使用相同的数据模型,相同的索引等项目中生成的sqlite文件(〜200Mb)…和第一次启动时我复制数据库文件预填充数据

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); } 

复制工作正常,数据可以正常访问。 但是performance糟透了,索引显然没有被使用。
看看复制操作后的sqlite文件的大小,它从200Mb到120Mb。
在模型中一切看起来都不错,需要被索引的东西被检查为索引。

1)有没有办法索引数据不会被删除时复制SQLite?
2)是否有可能以编程方式重build索引?
3)其他的想法?

检查苹果文档有关这个问题 :

尽pipeCore Data支持SQLite作为其持久存储types之一,但数据库格式是私有的。 您不能使用本地SQLite API创buildSQLite数据库,并直接将其与Core Data一起使用(也不应该使用本机SQLite API来操作现有的Core Data SQLite存储)。 如果您有一个现有的SQLite数据库,则需要将其导入到Core Data存储中(请参阅“ 有效导入数据 ”)。

总之, 要这样做。 数据库模式是私人的,可能会改变。

当应用程序第一次启动时,我使用CSV文件在后台将所有初始数据预加载到CoreData。 谨防multithreadingCoreData访问,顺便说一下。

希望能帮助到你。

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

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