iOSのコアデヌタ。 章番号1。 理論郚

ハブラリュディ、こんにちは

本日、マむケル・プリバヌトずロバヌト・ワヌナヌの本「iOS甚のプロコアデヌタ」に関する実践的な挔習で䞀連の講矩を曞き始めたいず思いたす。 各章には、理論的および実甚的な郚分が含たれたす。







内容







降りる



コアデヌタずは


コンピュヌタヌを䜿甚しおタスクを実行するず、倉曎が保存されるこずが期埅されたす。 倉曎の保存は、オフィス゜フトりェアパッケヌゞ、テキスト゚ディタヌ、ゲヌム、ブラりザヌなどで重芁な圹割を果たしたす。 ほずんどの゜フトりェアには、䜜業状態を埌で埩元するためにナヌザヌが入力したデヌタを保存する機胜が必芁ですが、もちろん、それを必芁ずしない゜フトりェアがありたす-電卓、ニュヌスフィヌド、アラヌム、倩気りィゞェット。

高床なアプリケヌションを開発するずきは、iDeviceにデヌタを保存する方法を理解するこずが重芁です。



Appleは、デバむスに保存されおいるデヌタを扱うための柔軟なフレヌムワヌク、Core Dataを提䟛しおいたす。 もちろん、Core Dataは䞇胜薬ではなく、特定のタスクにより適したデヌタを保存するためのオプションは他にもありたすが、Core DataはCocoa Touchに非垞によくフィットしたす。 Core Dataは、デヌタりェアハりスでの䜜業に関する詳现のほずんどを隠し、アプリケヌションを本圓に楜しくナニヌクで䜿いやすいものにするこずに集䞭できたす。



Core DataはSQLiteのようなリレヌショナルデヌタベヌスにデヌタを保存できるずいう事実にもかかわらず、Core DataはDBMSではありたせん。 実際、Core Dataはリレヌショナルデヌタベヌスをストレヌゞずしおたったく䜿甚しない堎合がありたす。 Core DataはHibernateのようなものではありたせんが、いく぀かのORM機胜を提䟛したす。 コアデヌタは、通垞のオブゞェクト指向プログラミングでオブゞェクトグラフを操䜜するのに䌌た圢匏で、゚ンティティずその関係他のオブゞェクトずの関係、属性を操䜜できるデヌタラッパヌ/フレヌムワヌクである可胜性がありたす。



知っおる

コアデヌタは、Mac OS X 10.4 TigerおよびiPhone SDK 3.0以降にのみ導入されたした





IOSストレヌゞ履歎


ピクサヌがリリヌスしたアニメヌション映画に぀いおNeXTに感謝すべきであるように、Core Dataにも感謝すべきです。 コアデヌタは、Enterprise Objects FrameworkEOFず呌ばれるテクノロゞヌから生たれ、進化したした。

フレヌムワヌクのデビュヌは2005幎にMac OS X 10.4Tigerの発売ずずもに行われたすが、iPhoneはバヌゞョン3.0以降でのみ衚瀺されたす。

Core DataがiPhoneに届く前は、開発者は苊劎し、次のオプションを䜿甚しおデヌタを保存できたした。

1さたざたなデヌタ型のキヌず倀のペアを含むプロパティのリスト。

2デヌタのシリアル化ずファむルぞの保存NSCodingプロトコルが䜿甚された

3SQLiteリレヌショナルデヌタベヌス

4クラりド内のデヌタストレヌゞ



これらの方法は珟圚も䜿甚されおいたすが、Core Dataを䜿甚しお利䟿性の芳点から比范できる4぀の方法の1぀はありたせん。 FMDatabaseやActiveRecordなどのフレヌムワヌクの誕生にもかかわらず、Core Dataの登堎前のデヌタストレヌゞの問題を解決するため、開発者は喜んでCore Dataに切り替えたした。

Core Dataはすべおの病気の治療法ではないこずを繰り返したすが、もちろん、たずえばプロパティのリストを䜿甚しお゜リュヌションを参照するこずもありたすが、ほずんどの堎合、アプリケヌションでCore Dataをあなたの問題を解決する最良の方法。

Core Dataをより頻繁にプログラミングしお䜿甚するほど、「Core Dataを䜿甚する必芁がありたすか」ずいう質問は頻繁になくなりたすが、「Core Dataを䜿甚しない理由はありたすか」



Core Dataを䜿甚したシンプルなアプリケヌションの䜜成


このセクションでは、Xcodeテンプレヌトの1぀からコアデヌタに基づいお簡単なアプリケヌションを䜜成し、その䞻芁郚分を分析したす。 このパヌトの最埌では、アプリケヌションがどのようにCore Dataずやり取りしおデヌタを保存および取埗するかを理解したす。



コアデヌタコアコンポヌネントに぀いお


コヌドに飛び蟌んでテストアプリケヌションを解析する前に、Core Dataのコンポヌネントに぀いお理解する必芁がありたす。 次の図は、テストアプリケヌションで䜿甚する䞻な芁玠を瀺しおいたす。



コアデヌタナヌザヌずしお、デヌタりェアハりスを盎接操䜜しないでください。 ストレヌゞから離れお、ストレヌゞの皮類から、デヌタのみを考えおください このアプロヌチの特城は、倧量のコヌドを倉曎せずにストレヌゞのタむプを簡単に倉曎できるこずですXMLファむルがありたしたが、SQLiteになりたした。

フレヌムワヌクによっお管理されるオブゞェクトコアデヌタは、NSManagedObjectクラスのメ゜ッド/プロパティを継承する必芁がありたす。

人々ず同じように、オブゞェクトにはオブゞェクトが存圚できる環境が必芁です。そのような環境は管理オブゞェクトコンテキスト管理オブゞェクトのコンテキストたたは単にコンテキストず呌ばれたす。 オブゞェクトが眮かれおいる環境は、䜜業䞭のオブゞェクトの状態だけでなく、関連するオブゞェクトこれに䟝存し、䟝存しおいるオブゞェクトの状態も監芖したす。

NSManagedObjectContextクラスのむンスタンスは、オブゞェクトに察しお同じ環境を提䟛したす。このタむプのオブゞェクトは、アプリケヌションで垞に利甚可胜である必芁がありたす。 通垞、NSManagedObjectContextクラスのむンスタンスは、アプリケヌションのデリゲヌトプロパティです。 環境がなく、NSManagedObjectContextクラスのむンスタンスがないず、コアデヌタを操䜜できたせん。



新しいプロゞェクトを䜜成する


Xcodeを起動し、マスタヌ/ディテヌルアプリケヌションテンプレヌトから新しいプロゞェクトを䜜成したす。

画像



次のようにフィヌルドに入力したす。

画像



䜜成が完了するず、次のようなものが衚瀺されたす。

画像



プロゞェクトを立ち䞊げたす


このアプリケヌションの内郚にあるものを理解する前に、アプリケヌションが䞀般的に䜕をするのかを始めたしょう。

「実行」ボタンをクリックするず、これが目の前に衚瀺されたす。

画像



「+」の付いたボタンを数回抌すず、時間の経過ずずもにリストにいく぀かの゚ントリが衚瀺されたす。

画像



ここで、アプリケヌションを終了停止し、アプリケヌションがデヌタの保存にコアデヌタを䜿甚しない堎合、次の開始時に空のリストが再び衚瀺されたすが、再起動埌、同じ画像が衚瀺されたす。

画像



アプリケヌションのコンポヌネントを分析したす


アプリケヌションの構造は比范的単玔です。 デヌタベヌスストレヌゞに栌玍されおいる゚ンティティを蚘述するデヌタモデルが存圚する堎合。 画面テヌブルずデヌタりェアハりス間の盞互䜜甚を促進するコントロヌラヌ。 アプリケヌションの初期化ず実行を支揎するアプリケヌションデリゲヌト。

以䞋の画像は、アプリケヌションで䜿甚されるクラスずそれらの盞互関係を瀺しおいたす。

画像



MasterViewControllerクラスには、NSManagedObjectContextクラスのむンスタンスを参照しおコアデヌタずやり取りするプロパティが含たれおいるこずに泚意しおください。 コヌドを確認するず、MasterViewControllerがアプリケヌションのデリゲヌトプロパティから管理察象オブゞェクトコンテキストを取埗しおいるこずがわかりたす。



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if(self){ self.title = NSLocalizedString(@"Master", @"Master"); id delegate = [[UIApplication sharedApplication] delegate]; self.managedObjectContext = [delegate managedObjectContext]; } return self; }
      
      







BasicApplication.xcdatamodelは、デヌタモデルの構造に関する情報を含むファむルシステム内のディレクトリです。 デヌタモデルは、コアデヌタを䜿甚するすべおのアプリケヌションの基盀です。

このアプリケヌションのデヌタモデルは、1぀の゚ンティティ-むベントのみを蚘述したす。 むベント゚ンティティには、1぀のプロパティフィヌルド、属性のみが含たれたす-タむプDateのtimeStamp。





NSManagedObjectタむプのむベント゚ンティティ。コアデヌタの制埡䞋にあるすべおの゚ンティティのメむン゚ンティティず芋なされたす。 2番目の章では、NSManagedObject型をさらに詳しく芋おいきたす。



デヌタの取埗/取埗


次に興味のあるクラスはMasterViewControllerです。 そのヘッダヌファむルには、泚意する2぀のプロパティが蚘述されおいたす。

 @property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController; @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
      
      





NSFetchedResultsControllerは、ストレヌゞ芁求を管理するためにCore Dataフレヌムワヌクによっお提䟛されるコントロヌラヌです。

NSManagedObjectContextは、NSManagedObject型のオブゞェクトが存圚する環境ずしおすでに知られおいたす。



MasterViewController.mファむルにあるMasterViewControllerクラスの実装は、デヌタを取埗および保存するためにCore Dataず察話する方法を瀺しおいたす。 MasterVIewControllerクラスの実装には、ストレヌゞからデヌタを遞択する芁求を事前蚭定する明瀺的なゲッタヌfetchedResultsControllerがありたす。



デヌタサンプリングのク゚リを䜜成する最初の手順は、ク゚リを䜜成するこずです。

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity];
      
      





ク゚リ結果は、NSSortDescriptorを䜿甚しお゜ヌトできたす。 NSSortDescriptorは、゜ヌトフィヌルドず゜ヌトタむプ昇順たたは降順を定矩したす。

この䟋では、レコヌドの䜜成時間を降順に䞊べ替えたす。

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors];
      
      





リク゚ストが定矩されたら、NSFetchedResultsControllerの䜜成に進むこずができたす。

NSFetchedResultsController MasterVIewControllerをデリゲヌトずしお䜿甚しお、ストレヌゞデヌタの状態削陀、远加、移動などを監芖し、この゜リュヌションをUITableViewずシヌムレスに統合できたす。 もちろん、管理オブゞェクトコンテキストでexecuteFetchRequestメ゜ッドを呌び出すこずで同じ結果を取埗できたすが、この堎合、NSFetchedResultsControllerを受信せず、十分に掻甚できたせん。

NSFetchedResultsControllerクラスのむンスタンス倉数を䜜成しお構成したす。

 NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController;
      
      







知っおる

おそらく、以前に䜿甚したinitWithFetchRequestメ゜ッドにcacheNameパラメヌタヌがあるこずに気づいたでしょう。 匕数ずしおnilを枡すず、リク゚ストの結果をキャッシュする可胜性を陀倖したすが、キャッシュの名前を指定するず、Core Dataが以前に実行された同じリク゚ストの存圚をチェックし、キャッシュから結果を返すこずができたす。 それ以倖の堎合、このキャッシュ名のリク゚ストがない堎合、ストレヌゞに察しおリク゚ストが行われ、必芁なデヌタが返され、埌でキャッシュされたす。





結論ずしお、私たちに残されおいるのは、デヌタを取埗する芁求を満たすこずだけです。

 NSError *error = nil; if(![self.fetchedResultsController performFetch:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); }
      
      





以䞋に、完党なfetchedResultsControllerゲッタヌがありたす。

 - (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsController != nil) return _fetchedResultsController; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; [fetchRequest setFetchBatchSize:20]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; NSError *error = nil; if(![self.fetchedResultsController performFetch:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return __fetchedResultsController; }
      
      





NSFetchedResultsControllerはNSManagedObject型のオブゞェクトのコレクションのようなものです。このため、ク゚リ結果にアクセスするためにNSArray型のfetchedObjectsプロパティさえ持っおいたす。

UITableViewControllerの機胜も拡匵するMasterVIewControllerクラスは、NSFetchedResultsControllerを䜿甚しおテヌブルのコンテンツを管理するこずがいかに䟿利かを瀺しおいたす。



新しいオブゞェクトを挿入する


insertNewObjectメ゜ッドを䞀芋するず、新しいむベントがどのように䜜成され、リポゞトリに远加されるかが明確になりたす。 NSManagedObjectsは、デヌタモデルの゚ンティティ蚘述によっお定矩され、特定のコンテキスト環境にのみ存圚できたす。 新しいオブゞェクトを䜜成する最初のステップは、このオブゞェクトが䜜成されるコンテキストを取埗するこずです。

 NSManagedObjectContext *managedObjectContext = [self.fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
      
      





NSManagedObjectを䜜成したす。

 NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntity:[entity name] inManagedObjectContext:context]; [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];
      
      





実行する必芁がある最埌の手順は、新しいオブゞェクトが䜜成されたコンテキストを保存するこずです。 コンテキストを保存するず、以前に保存されなかったすべおの倉曎が保存されるこずに泚意しおください。

 NSError *error = nil; if(![context save:&error]){ NSLog(@"Unresolved error: %@, %@", error, [error userInfo]); abort(); }
      
      





新しいオブゞェクトを远加する完党な方法を以䞋に瀺したす。

 - (void)insertNewObject { NSManagedObjectContext *managedObjectContext = [self.fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"]; NSError *error = nil; if(![context save:&error]){ NSLog(@"Unresolved error: %@, %@", error, [error userInfo]); abort(); } }
      
      







コンテキストの初期化環境


明らかに、コンテキストオブゞェクトを䜜成せずに、オブゞェクトが存圚し生掻する環境がなければ、以前に行ったこずすべおを達成するこずはできたせん。 アプリケヌションデリゲヌトは、たさにこの環境を䜜成する責任がありたす。 コアデヌタを䜿甚するアプリケヌションで必芁な3぀のプロパティ

 @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
      
      





3぀のプロパティはすべお読み取り専甚であるこずに泚意しおください。これは、倖郚から蚭定できないようにするためです。 BasicApplicationAppDelegate.mを調べるず、3぀のプロパティすべおに明瀺的なゲッタヌがあるこずがわかりたす。



管理オブゞェクトモデル

 - (NSManagedObjectModel *)managedObjectModel { if(_managedObjectModel != nil){ return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"BasicApplication" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modeURL]; return _managedObjectModel; }
      
      





その埌、䜜成されたデヌタモデルをサポヌトするストレヌゞが䜜成されたす。 実際、コアデヌタを䜿甚する他のほずんどの堎合ず同様に、デヌタりェアハりスはSQLiteに基づいおいたす。

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if(_persistentStoreCoordinator != nil){ return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"BasicApplication.sqlite"]; NSError* error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; }
      
      







コンテキスト環境を䜜成したす。

 - (NSManagedObjectContext *)managedObjectContext { if(_managedObjectContext != nil){ return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if(coordinator != nil){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; }
      
      







コンテキストは、コアデヌタおよび氞続ストレヌゞず察話するためのむンタヌフェむスずしおアプリケヌション党䜓で䜿甚されたす。

コアデヌタの初期化シヌケンス





メカニズムは、applicationdidFinishLaunchingWithOptionsメ゜ッドが呌び出されたずきに開始されたす。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; MasterViewController *controller = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; return YES; }
      
      







実行のためにアプリケヌションデリゲヌトのmanagedObjectContextプロパティのgetterを呌び出すず、䞀連のアクションが起動したす。

-NSManagedObjectContext *managedObjectContextの呌び出し

-NSPersistentStoreCoordinator *persistentStoreCoordinator、これは順番に呌び出しを行いたす

-NSManagedObjectModel *managedObjectModel。

したがっお、managedObjectContextのgetterメ゜ッドを呌び出すず、Core Dataオブゞェクトのスタック党䜓が初期化され、Core Dataにアラヌトが送信されたす。



既存のプロゞェクトにコアデヌタを远加する


次の3぀のステップで実行されたす。

  1. コアデヌタフレヌムワヌクの远加
  2. デヌタモデルの䜜成
  3. コンテキストの初期化環境




コアデヌタフレヌムワヌクの远加


Objective-Cの䞖界では、ラむブラリはフレヌムワヌクず呌ばれたす。

「クリヌン」プロゞェクトで既に接続されおいる暙準フレヌムワヌクで、最も頻繁に衚瀺されるもの





新しいフレヌムワヌクはどこに远加されたすか





接続するフレヌムワヌクを遞択したす。





デヌタモデルの䜜成


デヌタモデルがなければ、完党なCore Dataアプリケヌションずは芋なされたせん。 デヌタモデルは、コアデヌタによっお管理されるすべおの゚ンティティを蚘述したす。

新しいデヌタモデルを䜜成するには[ファむル]-> [新芏]-> [新しいファむル]





モデルをMyModel.xcdatamodeldず呌びたす





モデルの䜜成埌、゚ンティティを線集䜜成するためのりィンドりが開きたす。





Xcodeの巊䞋にある[+]ボタンをクリックしお新しい゚ンティティを䜜成し、[属性]セクションに既にある[+]ボタンをクリックしお新しい゚ンティティ属性を远加し、そのタむプを遞択したす。





コンテキストの初期化環境


最埌の手順は、コンテキスト、ストレヌゞ、およびオブゞェクトモデルを初期化するこずです。 ほずんどの堎合、Core Dataを䜿甚する「空の」プロゞェクトでXcodeによっお自動的に生成されるコヌドを䜿甚できたす。



DemoAppAppDelegate.h

 #import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface DemoAppDelegate : UIResponder <UIApplicationDelegate> { } @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UINavigationController *navigationController; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext; - (NSURL *)applicationsDocumentsDirectory; @end
      
      







* .mファむルDemoAppAppDelegateに切り替えお、次の行を蚘述したす。

 @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
      
      







以䞋は、デヌタモデル、ストレヌゞ、およびコンテキストを初期化するコヌドです。

 - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil){ return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modeURL]; return _managedObjectModel; }
      
      







 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if(_persistentStoreCoordinator != nil){ return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DemoApp.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; }
      
      







 - (NSManagedObjectContext *)managedObjectContext { if(_managedObjectContext != nil){ return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if(coordinator != nil){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; }
      
      







これたでに実装したこずのないメ゜ッド

 - (NSURL *)applicationDocumentsDirectory{ return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; }
      
      





 - (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; if(managedObjectContext != nil) { if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } }
      
      





コアデヌタを接続したので、アプリケヌションはそれを䜿甚しおデヌタを保存できたす。

すべおが正垞に機胜し、デヌタが実際に保存されるこずを確認できる簡単な䟋を実装したしょう。

テスト䟋では、アプリケヌションが起動された回数を刀断したす。

アプリケヌションに小さな倉曎を加えたす。アプリケヌションが以前に起動された回数を受け取り、新しい起動むベントを远加するずいう圢で、アプリケヌションデリゲヌトのdidFinishLaunchingWithOptionsメ゜ッドを行いたす。



以前のアプリケヌションの起動を取埗するためのコヌド

 NSManagedObjectContext *context = [self managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyData" inManagedObjectContext:context]; [request setEntity:entity]; NSArray *results = [context executeFetchRequest:request error:nil];
      
      







次に、次のように配列党䜓を調べたす。

 for(NSManagedObject *object in results){ NSLog(@"Found %@", [object valueForKey:@"myAttribute"]; }
      
      





新しい゚ントリを远加しお保存したす。

 NSString *launchTitle = [NSString stringWithFormat:@"launch %d", [results count]]; NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [object setValue:launchTitle forKey:@"myAttribute"]; [self saveContext]; NSLog(@"Added : %@", launchTitle);
      
      





最初の起動埌、アプリケヌションはコン゜ヌルに次の行を衚瀺したす。

 2011–02-25 05:13:23.783 DemoApp[2299:207] Added: launch 0
      
      





2回目の実行埌

 2011–02-25 05:15:48.883 DemoApp[2372:207] Found launch 0 2011–02-25 05:15:48.889 DemoApp[2372:207] Added: launch 1
      
      







完党な方法は次のずおりです。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSManagedObjectContext *context = [self managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entytyForName:@"MyData" inManagedObjectContext:context]; [request setEntity:entity]; NSArray *results = [context executeFetchRequest:request error:nil]; for(NSManagedObject *object in results){ NSLog(@"Found %@", [object valueForKey:@"myAttribute"]); } NSString *launchTitle = [NSString stringWithFormat:@"launch %d", [results count]]; NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [object setValue:launchTitle forKey:@"myAttribute"]; [self saveContext]; NSLog(@"Added : %@", launchTitle); [self.window makeKeyAndVisible]; return YES; }
      
      







結論ずしお


コメントの誀りに぀いおは曞かないようにお願いしたす。すぐにプラむベヌトメッセヌゞを曞くこずをお勧めしたす。



転送を続行する必芁がありたすか このトピックに興味はありたすか



ご枅聎ありがずうございたした



All Articles