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。
同样的方法现在工作正常。
- insertObject:atIndex:iOS6上的exception
- xcodebuild:cdtool无法编译:DataModelCompile /path/to/coredatamodel.xcdatamodeld dyld:找不到符号:_OBJC_CLASS _ $ _ OS_object
- 核心数据请求的分页结果
- 在运行期间dynamic创build核心数据实体
- 一对多关系:CoreData
- 在同一个数据库上同时使用基于core-data和sqlite c的api
- NSManagedObject属性数组
- 我可以在Core Data中访问用于外部二进制存储的文件吗?
- NSManagedObjectContext保存性能显着降低