1

我正在构建一个项目,我需要使用现有数据预填充 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)还有其他想法吗?

4

2 回答 2

1

查看有关此问题的 Apple 文档

尽管 Core Data 支持 SQLite 作为其持久存储类型之一,但数据库格式是私有的。您不能使用原生 SQLite API 创建 SQLite 数据库并将其直接与 Core Data 一起使用(也不应该使用原生 SQLite API 操作现有的 Core Data SQLite 存储)。如果您有现有的 SQLite 数据库,则需要将其导入核心数据存储(请参阅“<a href="http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/Articles /cdImporting.html#//apple_ref/doc/uid/TP40003174-SW1" rel="nofollow">高效导入数据")。

总而言之,要这样做。数据库架构是私有的,可能会更改。

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

希望能帮助到你。

于 2012-04-30T22:12:47.007 回答
0

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

同样的方法现在运行良好。

于 2013-02-01T00:34:43.247 回答