2012-04-30 37 views
1

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

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

我现在用在相同的数据模型,同一指数等项目产生的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); 
    } 

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

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

+0

你有没有想过如果你可以编程重建索引?我和你有同样的问题。谢谢! – baselq

回答

0

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

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

1

检查在Apple documentation about this issue

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

总结起来,不要做到这一点。数据库模式是私有的,可能会改变。

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

希望它有帮助。

+0

呃,不,我恐怕在这种情况下不会有帮助。我没有使用任何SQLite API顺便说一句,只是复制/粘贴sqlite文件,这工作得很好,如果没有索引问题。我的数据来自200万行csv文件(这只是一个测试,最终会接近1000万),所以在第一次启动时在后台加载并不会奏效,应用程序需要几个小时的加载在启动的时候... –

+0

你不能依赖为CoreData复制SQLite数据库,架构可能(并且确实)在设备和iOS版本之间发生变化。 – redent84

+0

好吧,在这种情况下,它是相同的应用程序,相同的设备(模拟器)...我只是在第一遍解析,然后删除sqlite文件,并将其放在捆绑。在第二遍中,我在第一次启动时复制sqlite文件,再次这工作正常,只是索引消失。我明白没有这种支持的意义。接下来的问题是索引是否可以通过编程方式重建。或者,有什么可能是最好的解决方法?我可以考虑使用海量数据库的一些应用程序,这些应用程序清晰地编入索引,但在第一次启动时即可正常运行。 –