Hatena::Groupxn--272ax3f

iOSアプリ開発勉強会#9

iOSアプリ開発勉強会#9

第17章CoreData

目次

  • オブジェクト志向マッピング
  • Homepwner を CoreData に移行する
    • モデルファイル
    • NSManagedObjectとサブクラ
    • PosessionStoreの更新
    • HomepwnerにAssetTypeを追加する
  • さらにSQLについて

オブジェクト志向マッピング

  • CoreData = ORM

Homepwner を CoreDataに移行する

準備
モデルファイル
  • リレーショナルモデルとオブジェクトモデルの対応付けを定義する
    • 図参照
  • 具体的な例
    • 画面参照
NSManagedObject
  • CoreDataでFetchされたデータの型
  • NSObjectのサブクラス
  • NSDictionaryっぽい何か
  • 拡張するには NSManagedObjectのサブクラスを作る(例: Posession)
PossessionStore の更新
  • CoreDataを使うために準備するクラス
    • NSManagedObjectContext
    • NSPersistentStoreCordinator
    • NSManagedObjectModel
    • 図参照
  • コード
    • 接続
    • 保存
    • 取得
      • 述語
    • 作成
    • 削除
HomepwnerにAssetTypeを追加する

さらにSQLについて

  • DEBUG表示
  • フィールドに対応するオブジェクトはlazyに取得される (図)
より突っ込んだトピック
  • NSFetchRequest
    • NSPredicate/NSSortOrdering/NSExpressionDescription/NSExpression
  • fetched property
  • モデルのversioning
  • NSMnagedObjectを作成するときのvalidation
  • 複数の永続ストアを扱う

第18章ローカライズ

グローバルにアプリを配布するには、国際化とローカライズが必要

国際化(internationalization)とは

  • 特定の文化圏の情報への依存をなくす
  • 言語、通貨、日付の表記法、数字の表記法

ローカライズとは

NSLocaleを使った国際化

  • NSLocaleが知っていること
  • 国ではなく「地域」
    • 複数の地域がある国がある

NSLocaleの使い方

  • [NSLocale currentLocale]
- (void)setPossession:(id)possession
{
    NSString *currencySynbol = [[NSLocalecurrentLocale] objectForKey:NSLocaleCurrencySymbol];
    [valueLabel setText:[NSStringstringWithFormat:@"%@%@", currencySynbol, [possession valueInDollars]]];
}

> $10
  • NSDateFormatterにはlocaleプロパティがある
    • localeに合わせてフォーマットを自動変更してくれる

リソースのローカライズ

xibファイルのローカライズ

  • 言語ごとに別々のxibファイルができる
  • ibtoolsを使うと文字列を抜き出して言語ファイルを作ってくれる
    • 言語ファイルを使ってxibを再構成できる
ibtool --export-strings-file ../../DetailViewController.strings DetailViewController.xib

/* Class = "IBUILabel"; text = "Name"; ObjectID = "7"; */
"7.text" = "Name";

/* Class = "IBUILabel"; text = "Serial"; ObjectID = "8"; */
"8.text" = "Serial";

/* Class = "IBUILabel"; text = "Value"; ObjectID = "9"; */
"9.text" = "Value";

/* Class = "IBUILabel"; text = "Label"; ObjectID = "10"; */
"10.text" = "Label";

ibtool --import-strings-file DetailViewController.strings DetailViewController.xib 

NSLocalizaedStringと文字列表

  • NSStringをNSLocalizedString()で置き換える
    • キーとコメントを引数にとる
NSString *string = NSLocalizedString(@"cancel.tile", @"Cancel button title");
文字列ファイルの生成
genstrings Possession.m

/* Cancel button title */
"cancel.tile" = "cancel.title";