1

coredata データベースに既存のデータを事前入力する必要があるプロジェクトを構築しています。

iOS シミュレーターで sqlite ファイルを作成するためのパーサーを作成しました。すべて正常に動作します。単一のエンティティを使用しており、属性の 1 つにインデックスが付けられています。データ ファイルをコア データに解析した後のパフォーマンスは素晴らしく、すべてが良好です。

現在、生成された 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 は永続ストア タイプの 1 つとして SQLite をサポートしていますが、データベース形式は非公開です。ネイティブ SQLite API を使用して SQLite データベースを作成し、Core Data で直接使用することはできません (ネイティブ SQLite API を使用して既存の Core Data SQLite ストアを操作することもできません)。既存の SQLite データベースがある場合は、それを Core Data ストアにインポートする必要があります (「<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 に答える