1

CoreData を使用する iPhone アプリがあります。

事前入力された SQLite データベースをそれに追加したいと考えています。データベースには 1 つのテーブルがあります (地理的な場所、それらの約 50K).city.sql このデータベースを追加する最善の方法は何か?

私はいくつかのアプローチを見ました ( /Users/user/Library/... にアプリ フォルダーを配置するなど) が、外部データベースは実際にはアプリ データベースと同じ構造ではありません (「ユーザー」テーブルなどはありません)。

このcitys.sqliteをデータソースとして扱いたいだけです..必要に応じてappname.sqliteアプリとマージしてもかまいません...

また、RestKit を使用して CoreData / API 統合を管理しています。

質問 - このcitys.sqliteをアプリに追加して、そのデータベースから事前入力されたデータをアプリに送信するにはどうすればよいですか?

4

2 に答える 2

3

Ok、

事前に入力されたデータベースを作成する私のアプローチは、作成するデータベースにのみデータを入力することを目的としたダミーアプリを作成することです。これにより、実際のアプリを使用せずにデータベースでテストを行うことができました。明らかに、モデルは同じでなければなりません。

次に、実際のアプリのメイン バンドルに配置できます。実行されると、アプリはデータベースがドキュメント フォルダーに存在するかどうかを確認し (たとえば)、存在しない場合は、バンドルからドキュメント フォルダーにデータベースをコピーします。

NSString *storePath = [[self applicationDocumentsDirectory] 
    stringByAppendingPathComponent: @"yourStore.sqlite"];
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] 
        pathForResource:@"yourStore" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

Core Data Importで、私が言いたいことを見つけることができます( 2 番目の部分についてですが、db にデータを入力する方法にも自由に従うことができます)。

それが役立つことを願っています。

編集

もっとよく説明しようと思います。

ダミー プロジェクトを作成します。

ここでは、メイン アプリで作成したモデル (エンティティを含む) を使用できます。ダミープロジェクトにコピーするだけです。いくつかのコードを作成して、SQL ストアにデータを入力しますNSManagedObjectContext。結果は、既に入力されている SQL ストアで構成されます。SQL ストアに触れる必要はありません (Core Data のみ)。アプリ シミュレーターのアプリケーション フォルダー ディレクトリに移動し、ストアをコピーして、メインのアプリケーション バンドルに配置します。

于 2013-02-21T21:01:35.937 に答える
3

編集:プレーンな SQLite データベースを使用している場合は、データを CoreData に適した永続ストアに移行する必要があります。これを行うには、sqliteライブラリを使用してデータを読み取ることができます。アプリで直接これを行うことも、このためのユーティリティアプリを作成することもできます。SQLite Core Data 永続ストアを取得したら、元の投稿に従ってください。


Core Data を使用すると、複数の SQLite ストアを 1 つのコンテキストに組み合わせることができます。に 2 つの永続ストアを追加するだけNSPersistentStoreCoordinatorです。

[coordinator addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:mainSQLiteURL // URL for your main DB
                                options:nil
                                  error:nil];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:citiesSQLiteURL // URL for the additional DB
                                options:nil
                                  error:nil];

NSFetchRequestこの後、エンティティを作成するとCity(エンティティ名はわかりません)、両方の SQLite ファイルから都市が返されます。

-setAffectedStores:ストアの 1 つだけを検索する場合は、フェッチ リクエストを設定できます。また、新しいオブジェクトを挿入するときは、コンテキストCityを呼び出して永続ストアを指定する必要があり-assignObject:toPersistentStore:ます。そうしないと、新しい都市をどこに保存するかについて混乱します。

または、これら 2 つのストアを 1 つのファイルにマージするだけです。

于 2013-02-21T21:55:18.120 に答える