ハブラリュディ、こんにちは!
本日、マイケル・プリバートとロバート・ワーナーの本「iOS用のプロコアデータ」に関する実践的な演習で一連の講義を書き始めたいと思います。 各章には、理論的および実用的な部分が含まれます。
内容:
- 章番号1。 はじめに ( 実用的な部分 )
- 章番号2。 マスターコアデータ ( 実践部 )
- 章番号3。 データストレージ:SQLiteおよびその他のオプション
- 章番号4。 データモデルの作成
- 第5章。 データオブジェクトの操作
- 第6章 結果セットの処理
- 章番号7。 パフォーマンスとメモリのチューニング
- 第8章。 バージョン管理と移行
- 章番号9。 NSFetchedResultsControllerを使用してテーブルを管理する
- 章番号10。 高度なアプリケーションでコアデータを使用する
エントリー
このモデルを作成します。
次に、いくつかのレコードを追加して要求します。 出力はコンソールに対して行われるため、視覚的な質問すらしません。
準備はいい? それでは行こう!
説明
お気に入りのリソースである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に次のものがあります。
そしてAppDelegate.mで:
アプリケーションを次のように書き換えます:didFinishLaunchingWithOptions:メソッド:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
アプリケーションを起動します。 データは保存されているはずです。 これをチェックしてください。
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人に質問を追加して、何らかの投稿を作成しましょう。
アプリケーションを実行し、データベースを確認します。
sqlite> select * from ZQUESTION; 1|4|1|4|Who am I?| . sqlite>
従業員Vasya Pupkinにブログ投稿を追加します。
そして結論:
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!
ユーザーが勤務している組織の名前の取得方法に注意してください。 どうですか? え? 私はそれが好きだと思った!
結論として
実験! 何かが壊れても心配しないでください。完全なプロジェクトは
このリンクで見つけることができます。
幸運を祈ります。ご清聴ありがとうございました!
実用的な部分を楽しんでいただけたでしょうか。