我正在构建一个项目,我需要使用现有数据预先填充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)还有其他想法吗?
答案 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中的一个错误。
现在,同样的方法工作正常。