iOS的CoreData - 预填充数据库与现有的索引(iOS CoreData - prepop

2019-09-27 04:33发布

我建立一个项目,我需要预先填充与现有数据coredata数据库。

我建了一个解析器创建在iPhone模拟器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);
    }

复制工作正常,并且数据可以正常访问。 然而,表现更是惨不忍睹,显然是不能被使用的索引。
一看拷贝后的源码文件的大小,它从200MB去了120MB。
一切都在模型中,需要建立索引,而索引检查看起来没事。

1)是否有不超过复制源码时被删除索引数据的方法吗?
2)是否有可能以编程方式重建索引?
3)任何其他的想法?

Answer 1:

检查在这个问题苹果文档 :

虽然核心数据支持SQLite作为其持久性存储类型之一,该数据库格式是私有的。 使用本机的SQLite API不能创建一个SQLite数据库,并直接与核心数据使用(也不使用本机的SQLite API,你应该处理现有的核心数据的SQLite店)。 如果你有一个现有的SQLite数据库,你需要将其导入到核心数据存储(见“ 高效导入数据 ”)。

综上所述, 这样做。 数据库模式是私人和可能发生变化。

我使用CSV文件预先加载的背景我所有的初始数据CoreData应用程序启动时的第一次。 谨防多线程CoreData访问,顺便说一下的。

希望能帮助到你。



Answer 2:

看起来,问题是,该项目并没有得到很好的测试之间的清洗,也有可能是在Xcode 4.3中的错误我用的时间。

现在同样的方法是工作的罚款。



文章来源: iOS CoreData - prepopulate db with existing indexes