iOSのコアデータ。 章番号2。 実用部

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

本日、マイケル・プリバートとロバート・ワーナーの本「iOS用のプロコアデータ」に関する実践的な演習で一連の講義を書き始めたいと思います。 各章には、理論的および実用的な部分が含まれます。







内容:







エントリー


このモデルを作成します。

画像



次に、いくつかのレコードを追加して要求します。 出力はコンソールに対して行われるため、視覚的な質問すらしません。

準備はいい? それでは行こう!



説明


お気に入りのリソースであるHabrのオブジェクトグラフを作成します。

N個の主なオブジェクトがあります。



それで十分でしょう。



各オブジェクトにはどのデータが含まれていますか?





仕事を始める


Xcodeを開き、新しいシングルビューアプリケーションプロジェクトを作成します。





プロジェクトの名前、プレフィックスなどを入力します。

画像



使い慣れたウィンドウ:

画像



コアデータを追加する


Core Data Frameworkをプロジェクトに追加します。

画像



モデルを作成する


新規ファイルの追加-> iOS-> CoreData->データモデル

画像

画像



ブログの投稿から始めましょう。

新しいエンティティを作成してBlogpostと呼び、 キャプション (文字列)とテキスト (文字列)の2つの属性を追加します。

画像



新しいエンティティを作成し、 Userと呼び、 アバター (文字列)、 メール (文字列)、 性別 (10進数)、 カルマ (整数16)、 ニックネーム (文字列)、 評価 (整数16)の属性を追加します。

画像



新しいエンティティを作成してTagという名前を付け、属性 (String)を1つだけ追加します。

画像



新しいエンティティを作成し、 Habという名前を付けて、2つの属性name (String)、 target (Boolean)を追加します。

画像



新しいエンティティを作成し、 Questionという名前を付けて、2つの属性caption (String)、 text (String)を追加します。

画像



新しいエンティティを作成してResponseと呼び、1つの属性テキスト (String)を追加します。

画像



新しいエンティティを作成してOrganizationと呼び、 名前 (文字列)、 評価 (整数16)の2つの属性を追加します。

画像



結果は次のとおりです。

画像



次に、オブジェクト間の関係を設定しましょう。

企業アカウントには多くのユーザー(従業員)がいます。

ユーザーには多くのブログエントリがあり、ブログエントリには多くのタグとハブがあります。

ユーザーには多くの質問があり、質問には多くの回答があります。



「企業アカウント」(1対多)の「ユーザー」関係の構築から始めましょう。

エンティティのリストから「 組織」を選択し、「関係」セクションの「+」をクリックして新しい関係を追加します。

画像



デフォルトでXcodeは1対1の関係を作成するため、接続のタイプを変更する必要があります。

画像



現在、各組織には多くのユーザーがいます。 また、 Inverseフィールド(フィードバック)を確立しますが、最初にUserエンティティに新しい接続を追加し、 組織と呼びます(ユーザーが働いている組織。どこでも機能しない場合、フィールドはnullになります)。

画像



ここで、 Organizationエンティティの編集を再度開き、 組織Inverseフィールドを設定します。

画像



オブジェクトグラフは次のようになります。

画像



残りの接続を自分で調整してから、私が行ったことを確認してください。

接続の作成方法、接続の種類を1対1から1対多に変更する方法を知っています。これで十分です。

最終画像:

画像



組織を作成する


すでにAppDelegate.hに次のものがあります。

// // TMAppDelegate.h // Habrahabr // // Created by AndrewShmig on 8/31/13. // Copyright (c) 2013 TM. All rights reserved. // #import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @class TMViewController; @interface TMAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) TMViewController *viewController; @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel; @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; @end
      
      





そしてAppDelegate.mで:

 // // TMAppDelegate.m // Habrahabr // // Created by AndrewShmig on 8/31/13. // Copyright (c) 2013 TM. All rights reserved. // #import "TMAppDelegate.h" @implementation TMAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } #pragma mark - Core Data Stack - (NSManagedObjectModel *)managedObjectModel { if(nil != _managedObjectModel) return _managedObjectModel; _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if(nil != _persistentStoreCoordinator) return _persistentStoreCoordinator; NSURL *storeURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"Habrahabr.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(nil != _managedObjectContext) return _managedObjectContext; NSPersistentStoreCoordinator *store = self.persistentStoreCoordinator; if(nil != store){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:store]; } return _managedObjectContext; } @end
      
      





アプリケーションを次のように書き換えます:didFinishLaunchingWithOptions:メソッド:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //   NSManagedObject *yandex = [NSEntityDescription insertNewObjectForEntityForName:@"Organization" inManagedObjectContext:self.managedObjectContext]; [yandex setValue:@"Yandex Inc." forKey:@"name"]; [yandex setValue:@672 forKey:@"rating"]; //   Yandex NSManagedObject *pupkin = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext]; [pupkin setValue:@"VaseaPup" forKey:@"nickname"]; [pupkin setValue:@"vasilisa@yandex.ru" forKey:@"email"]; [pupkin setValue:@1 forKey:@"gender"]; // 0 - unknown, 1 - male, 2 - female [pupkin setValue:@0 forKey:@"karma"]; [pupkin setValue:@0 forKey:@"rating"]; NSManagedObject *gosha = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext]; [gosha setValue:@"Goshka" forKey:@"nickname"]; [gosha setValue:@"gosha.k@yandex.ru" forKey:@"email"]; [gosha setValue:@0 forKey:@"gender"]; [gosha setValue:@0 forKey:@"karma"]; [gosha setValue:@0 forKey:@"rating"]; //     NSMutableSet *employees = [yandex mutableSetValueForKey:@"employees"]; [employees addObject:pupkin]; [employees addObject:gosha]; //     [self saveContext]; NSLog(@"Finish!"); return YES; }
      
      





アプリケーションを起動します。 データは保存されているはずです。 これをチェックしてください。

Habrahabr.sqliteファイルを見つけます。

画像



ターミナルを実行し、データベース構造を確認します。

 AndrewShmigs-MacBook-Pro:~ new$ cd "/Users/new/Library/Application Support/iPhone Simulator/6.1/Applications/95B0716A-9C2C-4BD8-8117-62FB46BB5879" AndrewShmigs-MacBook-Pro:95B0716A-9C2C-4BD8-8117-62FB46BB5879 new$ ls Documents Habrahabr.app Library tmp AndrewShmigs-MacBook-Pro:95B0716A-9C2C-4BD8-8117-62FB46BB5879 new$ cd Documents/ AndrewShmigs-MacBook-Pro:Documents new$ ls Habrahabr.sqlite AndrewShmigs-MacBook-Pro:Documents new$ sqlite3 Habrahabr.sqlite SQLite version 3.7.12 2012-04-03 19:43:07 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .schema CREATE TABLE ZBLOGPOST ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZAUTHOR INTEGER, ZCAPTION VARCHAR, ZTEXT VARCHAR ); CREATE TABLE ZHAB ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZTARGET INTEGER, ZBLOGPOSTS INTEGER, ZNAME VARCHAR ); CREATE TABLE ZORGANIZATION ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZRATING INTEGER, ZNAME VARCHAR ); CREATE TABLE ZQUESTION ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZAUTHOR INTEGER, ZCAPTION VARCHAR, ZTEXT VARCHAR ); CREATE TABLE ZRESPONSE ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZQUESTION INTEGER, ZTEXT VARCHAR ); CREATE TABLE ZTAG ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZBLOGPOST INTEGER, ZNAME VARCHAR ); CREATE TABLE ZUSER ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZKARMA INTEGER, ZRATING INTEGER, ZORGANIZATION INTEGER, ZGENDER DECIMAL, ZAVATAR VARCHAR, ZEMAIL VARCHAR, ZNICKNAME VARCHAR ); CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB); CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER); CREATE INDEX ZBLOGPOST_ZAUTHOR_INDEX ON ZBLOGPOST (ZAUTHOR); CREATE INDEX ZHAB_ZBLOGPOSTS_INDEX ON ZHAB (ZBLOGPOSTS); CREATE INDEX ZQUESTION_ZAUTHOR_INDEX ON ZQUESTION (ZAUTHOR); CREATE INDEX ZRESPONSE_ZQUESTION_INDEX ON ZRESPONSE (ZQUESTION); CREATE INDEX ZTAG_ZBLOGPOST_INDEX ON ZTAG (ZBLOGPOST); CREATE INDEX ZUSER_ZORGANIZATION_INDEX ON ZUSER (ZORGANIZATION); sqlite> select * from ZORGANIZATION; 1|3|1|672|Yandex Inc. sqlite> select * from ZUSER; 1|7|1|0|0|1|0||gosha.k@yandex.ru|Goshka 2|7|1|0|0|1|1||vasilisa@yandex.ru|VaseaPup sqlite>
      
      





次に、従業員の1人に質問を追加して、何らかの投稿を作成しましょう。

 //     NSManagedObject *whoAmI = [NSEntityDescription insertNewObjectForEntityForName:@"Question" inManagedObjectContext:self.managedObjectContext]; [whoAmI setValue:@"Who am I?" forKey:@"caption"]; [whoAmI setValue:@"    ." forKey:@"text"]; NSMutableSet *goshasQuestions = [gosha mutableSetValueForKey:@"questions"]; [goshasQuestions addObject:whoAmI];
      
      





アプリケーションを実行し、データベースを確認します。

 sqlite> select * from ZQUESTION; 1|4|1|4|Who am I?|    . sqlite>
      
      





従業員Vasya Pupkinにブログ投稿を追加します。

 //       NSManagedObject *newPost = [NSEntityDescription insertNewObjectForEntityForName:@"Blogpost" inManagedObjectContext:self.managedObjectContext]; [newPost setValue:@"yandex. & yandex. & yandex." forKey:@"caption"]; [newPost setValue:@"Some text" forKey:@"text"]; //    NSManagedObject *hab1 = [NSEntityDescription insertNewObjectForEntityForName:@"Hab" inManagedObjectContext:self.managedObjectContext]; [hab1 setValue:@"iOS" forKey:@"name"]; [hab1 setValue:@YES forKey:@"target"]; NSManagedObject *hab2 = [NSEntityDescription insertNewObjectForEntityForName:@"Hab" inManagedObjectContext:self.managedObjectContext]; [hab2 setValue:@"Objective-C" forKey:@"name"]; [hab2 setValue:@YES forKey:@"target"]; NSMutableSet *habs = [newPost mutableSetValueForKey:@"habs"]; [habs addObject:hab1]; [habs addObject:hab2]; [[pupkin mutableSetValueForKey:@"blogposts"] addObject:newPost];
      
      





そして結論:

 sqlite> select * from ZBLOGPOST; 1|1|1|5|yandex. & yandex. & yandex.|Some text sqlite> select * from ZHAB; 1|2|1|1|1|iOS 2|2|1|1|1|Objective-C sqlite>
      
      







データ出力


すべての従業員と勤務先の会社名をリストします。 データレコードを記述したのと同じ方法でデータを読み取るためのコードを記述します。

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"]; NSArray *allUsers = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; for(NSManagedObject *user in allUsers){ NSString *nickname = [user valueForKey:@"nickname"]; NSString *organization = [user valueForKeyPath:@"organization.name"]; NSLog(@"%@ works at %@", nickname, organization); }
      
      





およそ次の出力が得られます(私のアプリケーションは数回起動され、データも数回追加されました)。

 2013-08-31 13:00:27.255 Habrahabr[18148:c07] Goshka works at Yandex Inc. 2013-08-31 13:00:27.257 Habrahabr[18148:c07] VaseaPup works at Yandex Inc. 2013-08-31 13:00:27.258 Habrahabr[18148:c07] VaseaPup works at Yandex Inc. 2013-08-31 13:00:27.258 Habrahabr[18148:c07] Goshka works at Yandex Inc. 2013-08-31 13:00:27.259 Habrahabr[18148:c07] VaseaPup works at Yandex Inc. 2013-08-31 13:00:27.259 Habrahabr[18148:c07] Goshka works at Yandex Inc. 2013-08-31 13:00:27.260 Habrahabr[18148:c07] Finish!
      
      





ユーザーが勤務している組織の名前の取得方法に注意してください。 どうですか? え? 私はそれが好きだと思った!



結論として


実験! 何かが壊れても心配しないでください。完全なプロジェクトはこのリンクで見つけることができます。



幸運を祈ります。ご清聴ありがとうございました!

実用的な部分を楽しんでいただけたでしょうか。



All Articles