iOS 5のコアデータ:既存のデータをロードおよびインポートする方法

こんにちは、ハブラ。 この記事の翻訳を提供します。これにより、Core Dataの主な機能が明らかになります。



注:

iOSチュートリアルのメンバーであるAdam Burkepileは、iOS 5のCore Dataシリーズを親切に更新しました。-この投稿では、それについて少しお話します。







このガイドは、iPhoneのコア日付のみを使用してデータをプリロードするよりエレガントな方法を示すために完全に書き直されました。



開始する前に、 プロジェクトをダウンロードします



既存のデータのプリロード/インポート



まず、データをコアデータにプリロードします。 この問題には2つの一般的な解決策があります。



1. 外部ソースから開始するときにコア日付を入力します 。 アプリケーションは、データベースがまだインポートされていないことに気付き、外部ソース(SQLiteデータベースやXMLファイルなど)からデータの読み取りを開始してから、データをCore Dataに貼り付け始めます。



2. 事前に入力されたSQLiteデータベースを提供します。 これを行うには、コアデータ(Core Data)がモデルに基づいてデータベース構造を作成できるようにし、データベースに何らかのユーティリティプログラムを追加します。 ユーティリティプログラムは、MacまたはCore Dataを使用してCore Data APIを介してデータベースに入力する別のiPhoneプログラム、またはSQLiteデータベースに直接入力する他のプログラムです。 データベースがいっぱいになったら、アプリケーションでデータベースをオンにし、他のデータベースがまだ存在しない場合、アプリケーションがデフォルトのデータベースとして使用するように強制します。



次に、アプリケーションで使用できるプリロードされたコアデータデータベースを作成する簡単なユーティリティアプリケーションの作成方法を示します。



開始する



使用する方法の主な利点は、iOSのコアデータがOS Xのコアデータと同じであり、同じモデルとクラスを使用できることです。



つまり、OS Xで簡単なコンソールアプリケーションを作成し、これらのアプリケーションをCore Dataデータウェアハウスに関連付け、それを使用してデータウェアハウスからiOS上のプロジェクトのデータにデータを移動できます。 素晴らしいですか?



見てみましょう。 これを行うには、Mac上でコンソールアプリケーションを作成してデータをプリロードします。 Xcodeを開いて新しいプロジェクトを作成し、Mac OS X \ Application \ Command Line Tool templateを選択します。





プロジェクトの名前として「CoreDataTutorial2」と入力し、タイプを「Core Data」に変更して、「Use Reference Reference Counting」を有効にします。





プロジェクトの作成を終了し、「CoreDataTutorial2.xcdatamodeld」を選択して削除します。 メッセージが表示されたら、「ゴミ箱に移動」を選択します。





次に、ダウンロードしたアーカイブからディレクトリを入力し、次のファイルを見つけます。



-FailedBankCD.xcdatamodeld

-FailedBankInfo.h

-FailedBankInfo.m

-FailedBankDetails.h

-FailedBankDetails.m



これらのファイルをこのプロジェクトのディレクトリにコピーし、Xcodeにドラッグします。







「コピー先グループのフォルダにアイテムをコピーする(必要な場合)」チェックボックスがオンになっていることを確認し、そうでない場合は「ターゲットに追加」チェックボックスの「CoreDataTutorial2」チェックボックスをオンにしてください。





main.mを選択します。 基になるデータ型としてCore Dataを選択したことに気づくでしょう。 ここで、iOSプロジェクトのクラスモデルを使用してCore Dataオブジェクトを生成するために、いくつかの変更を行う必要があります。



managedObjectModel()で、メソッドを置き換えます。

NSString *path = [[[NSProcessInfo processInfo] arguments] objectAtIndex:0]; path = [path stringByDeletingPathExtension];
      
      







 NSString *path = @"FailedBankCD";
      
      





これは、最初に削除したCoreDataTutorial2.xdatamodeldの代わりに追加したアプリケーションFailedBankCD.xdatamodeldを指します。



コンパイルして実行し、エラーがないことを確認します。



これを以前に作成して実行した場合、モデルの不一致エラーが発生します。

sqlite dbを削除するには、(alt)オプションを選択してメニューに移動し、「Products」と「Clean Build Folder ...」を選択します。



次のようなエラーが表示された場合:

 NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
      
      





これは、コードがファイル「momd」(コアデータの目的のバージョンがあるファイル)を探しているためです。

ただし、モデルに正しいバージョンがない場合は、単純な「ママ」として保存されます。 この記事で説明しているように、最速のコミットは、次のようにmanagedObjectModel()の行を置き換える必要があります。



  NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"mom"]];
      
      







これで、これはコンパイルおよび正常に動作するはずです(まだ出力はありません)。



データのインポート



この例では、JSONファイルからデータをインポートします。 アプリケーションでは、さまざまな形式からデータをインポートできます。

ただし、ここに示す中心的な考え方(Macアプリケーションを使用してファイルを読み取り、Core Dataに読み込む)は引き続き適用されます。



体験してみましょう! プロジェクトを右クリックして、「新規ファイル」を選択します。 「その他」および「空」のカテゴリを選択します。





ファイルに「Banks.json」という名前を付け、ファイルをターゲット「CoreDataTutorial2」に含めるようにしてください。







以下を新しいファイルに貼り付けます。

 [{ "name": "Bank1", "city": "City1", "state": "State1", "zip": 11111, "closeDate": "1/1/11" }, { "name": "Bank2", "city": "City2", "state": "State2", "zip": 22222, "closeDate": "2/2/12" }, { "name": "Bank3", "city": "City3", "state": "State3", "zip": 33333, "closeDate": "3/3/13" }, { "name": "Bank4", "city": "City4", "state": "State4", "zip": 44444, "closeDate": "4/4/14" } ]
      
      







これは、配列に4つの辞書を含むJSONエンコードされた文字列です。 各辞書には、FailedBankInfo / FailedBankDetailsオブジェクトにあるプロパティに対応するプロパティのペアがあります。



JSONの仕組みがわからない場合は、 このガイドをご覧ください



次に、このファイルをディクトリ製品にコピーするようにアプリケーションに指示する必要があります。 プロジェクトファイルを選択し、「CoreDataTutorial2」をターゲットにします。 [ビルドフェーズ]タブを選択し、

[ビルドフェーズの追加]をクリックし、[コピーファイルの追加]を選択します。 宛先を「製品ディレクトリ」に変更します。 最後に、「Banks.json」ファイルを「Add files」セクションにドラッグします。





これで、FailedBankモデルを使用してコアデータを開始し、初期化するアプリケーションができました。また、Banks.jsonファイルを持つデータソースを持つクラスがあります。 今、私たちは持っています:



-JSONブートファイル

-JSONをObjective-C配列に変換する

-各要素の管理対象エンティティを作成する配列をループします

-オブジェクトをCore Dataに保存します!



コーディングを入手してください! main.mを開き、次のコードをmain関数(autoreleasepoolブロックの最後)に追加します。

  NSError* err = nil; NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Banks" ofType:@"json"]; NSArray* Banks = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] options:kNilOptions error:&err]; NSLog(@"Imported Banks: %@", Banks);
      
      







したがって、メイン関数は次のようになります。

 int main(int argc, const char * argv[]) { @autoreleasepool { // Create the managed object context NSManagedObjectContext *context = managedObjectContext(); // Custom code here... // Save the managed object context NSError *error = nil; if (![context save:&error]) { NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error"); exit(1); } NSError* err = nil; NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Banks" ofType:@"json"]; NSArray* Banks = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] options:kNilOptions error:&err]; NSLog(@"Imported Banks: %@", Banks); } return 0; }
      
      







新しい組み込みNSJSONSerialization APIを使用して、JSONドキュメントをNSArrayなどの基本型に簡単に変換できるようになりました。

NSD辞書など 詳細については、このマニュアルお読みください



アプリケーションを実行してみましょう:

 2012-04-14 22:01:34.995 CoreDataTutorial2[18388:403] Imported Banks: ( { city = City1; closeDate = "1/1/11"; name = Bank1; state = State1; zip = 11111; }, { city = City2; closeDate = "2/2/12"; name = Bank2; state = State2; zip = 22222; }, { city = City3; closeDate = "3/3/13"; name = Bank3; state = State3; zip = 33333; }, { city = City4; closeDate = "4/4/14"; name = Bank4; state = State4; zip = 44444; } )
      
      







これで、Objective-Cオブジェクトにデータがあることがわかります。

そしてそれらを簡単に管理できること。 これで、これらのオブジェクトをCoreDataに簡単にインポートできます。



最初に、ファイルの先頭にいくつかのファイルを追加します。

 #import "FailedBankInfo.h" #import "FailedBankDetails.h"
      
      





次に、先ほど追加した以下のコードを追加します。



 [Banks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { FailedBankInfo *failedBankInfo = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankInfo" inManagedObjectContext:context]; failedBankInfo.name = [obj objectForKey:@"name"]; failedBankInfo.city = [obj objectForKey:@"city"]; failedBankInfo.state = [obj objectForKey:@"state"]; FailedBankDetails *failedBankDetails = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankDetails" inManagedObjectContext:context]; failedBankDetails.closeDate = [NSDate dateWithString:[obj objectForKey:@"closeDate"]]; failedBankDetails.updateDate = [NSDate date]; failedBankDetails.zip = [obj objectForKey:@"zip"]; failedBankDetails.info = failedBankInfo; failedBankInfo.details = failedBankDetails; NSError *error; if (![context save:&error]) { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } }]; // Test listing all FailedBankInfos from the store NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; for (FailedBankInfo *info in fetchedObjects) { NSLog(@"Name: %@", info.name); FailedBankDetails *details = info.details; NSLog(@"Zip: %@", details.zip); }
      
      







enumerateObjectsUsingBlock:メソッドを使用して、銀行の配列をループし、1つの銀行に入り、コンテキストを保存します。 次に、サンプルリクエストを発行し、すべての銀行をリストします。

 2012-04-14 22:15:44.149 CoreDataTutorial2[18484:403] Name: Bank1 2012-04-14 22:15:44.150 CoreDataTutorial2[18484:403] Zip: 11111 2012-04-14 22:15:44.150 CoreDataTutorial2[18484:403] Name: Bank2 2012-04-14 22:15:44.151 CoreDataTutorial2[18484:403] Zip: 22222 2012-04-14 22:15:44.152 CoreDataTutorial2[18484:403] Name: Bank3 2012-04-14 22:15:44.152 CoreDataTutorial2[18484:403] Zip: 33333 2012-04-14 22:15:44.153 CoreDataTutorial2[18484:403] Name: Bank4 2012-04-14 22:15:44.153 CoreDataTutorial2[18484:403] Zip: 44444
      
      





多田! これはコア日付のデータです。 エキサイティングな部分はあなたです、あなたはデータが来る方法を完全にカスタマイズできます。 小さな静的jsonファイルの代わりに、

私たちが使用した、より大きな/ a jsonファイルのペア、xmlファイルを使用して、スプレッドシートファイルをCSVファイルとしてエクスポートできます。 可能性は本当に無限です。



「医師、あなたはXcodeで必要です」



今、私たちは脳の手術を行っています。 OS Xアプリケーションコンソールで生成したばかりのsqliteデータベースを取得し、iPhoneアプリケーションに移植する必要があります。

sqliteデータベースを見つける最も簡単な方法は、CoreDataTutorial2製品を右クリックし、「Finderで表示」を選択することです。





これで、プロジェクトが開発された場所に新しいFinderウィンドウが開きます。 ここでは、4つのファイルを確認できます。



-Banks.json-銀行情報を含むjsonファイル

-CoreDataTutorial2-このアプリケーション

-FailedBankCD.momd(またはonly.mom)-これは、管理オブジェクトモデル(FailedBankCD.xdatamodeld)のコンパイル済みバージョンです。

-CoreDataTutorial2.sqlite-アプリケーションによって生成されるsqliteデータベース。





この「CoreDataTutorial2.sqlite」ファイルは、私たちが必要なジューシーなビットです。 このファイルをチュートリアル1のプロジェクトディレクトリにコピーします





「CoreDataTutorial2.sqlite」ファイルをFinderからXcodeプロジェクトにドラッグします(「コピー先グループのフォルダーにアイテムをコピー(必要な場合)」はチェックされませんが、「FailedBanksCD」では「ターゲットに追加」がチェックされます)。







最後に「FBCDAppDelegate.m」を開きます。 persistentStoreCoordinatorメソッドまでスクロールダウンします。 真下
 NSURL *storeURL = [[[[self app... line, add:
      
      







 if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) { NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CoreDataTutorial2" ofType:@"sqlite"]]; NSError* err = nil; if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) { NSLog(@"Oops, could copy preloaded data"); } }
      
      







これは、このアプリケーション用にsqlite DBが既に存在するかどうかを確認するコードチェックです。 存在しない場合は、プリロードされたsqliteデータベースのパスが検索され、

これをダウンロードし、データベースを通常のdBアプリケーションのパスにコピーしようとしています。 簡単です! それを実行します。 次のようなものがあるはずです。





以上です。 どうもありがとう。



All Articles