2016年3月27日日曜日

OSX: SQLite を使ったサンプルアプリケーション

このサンプル・アプリでは、Swift で SQLite を使うために、Stephen Celis氏のSQLite.swiftを使用します。


アプリ作成の事前準備

  1. sqlite3 のインストール
    参照:DB(1):SQLiteのインストールと管理ツール
  2. 作成するアプリのベースとして"OS X : テーブルビューを使うサンプルアプリケーション"を使用します。
  3. 上のベースプロジェクトで SQLite.swift を使用するための準備を行います:
    1. GitHub から SQLite.swift の Zipファイルをダウンロードして解凍します。
    2. 上記の解凍したファイルから SQLite.xcodeprj をベースプロジェクトへコピーします。
    3. General タブ(1)で、Linked Frameworks and Libraries の +ボタン(2)をクリックして、表示されたダイアログから以下のように適切なフレームワークを選択して Add ボタンを押します:


データベース処理を追加

  1. 連絡先クラスの修正
    /Model/Contact.swift を次のように修正します:

    ベースとしたプロジェクトの連絡先クラスに対して、いくつかの項目を追加します。
    • 5行:プライマリキーとして、INT64型の ID を追加します。
    • 9行:日付を処理する例を示すために NSDate型の生年月日を追加します。
    • 10-11行:性別とメモも追加します。
    • 12行:楽観的ロックのためのバージョン管理情報を追加(このアプリでは未使用)します。

  2. データベース定義クラスの作成
    SQLite.swift を使って、データベース接続、テーブル定義を行うためのクラスを作成します。
    /Repo/DBDef.swift ファイル:

    • 5行:デスクトップの Data フォルダの mydb.db データベースに接続します。なければ mydb.db ファイルが作成されます。
    • 19-32行:連絡先テーブルの定義クラス ContactDef:
      • 20行:テーブル名を contacts に設定します。
      • 23-30行:テーブルの列定義:
        • 23行:id の型を Integer 型に設定します。
        • 24-25行:"simei"、"yomi"を Text 型、NOT NULL に設定します。
        • 26-29行:"seibetu"、"seinenGappi"、"photo"、"memo" を Text型に設定します。
        • 30行:"version" を Integer 型に設定します。
      • 34-57行:データベース定義クラス ContactDdl:
        • 38-40行:イニシャライザで db プロパティにコネクションを設定します。
        • 44行:コネクションの run() メソッドでテーブル作成のSQL文を実行して、mydb.db データベースに contacts テーブルを作成します。
        • 45-54行:上記の列定義を使ってテーブル作成のSQL文を生成します。

  3. 連絡先リポジトリの作成
    連絡先クラスの CRUD処理を行うクラス /Repo/ContactRepo.swift を作成します:

    • 27-29行: findAll()
      contacts テーブルから登録されている連絡先データを全件取得します。
      デフォルトは、"yomi"列で昇順にソート(ContactDef.yomi.desc)します。
    • 31-38行: findAllOrderBy(cols: [Expressible])
      • 34行:contacts.order(cols) は cols が [ContactDef.yomi.desc] の場合
        'SELECT * FROM contacts ORDER BY "yomi" DESC' のSQL文に変換されます。
        db.prepare(SQL文) でこのSQL文が実行されて、該当行が SELECT されます。
      • 35行:取得行からC連絡先インスタンスを生成して連絡先リストに追加します。
    • 63-80行:save(ct: C連絡先)
      渡されたC連絡先インスタンスを連絡先テーブル(contacts)に保存します。
      • 64-70行:連絡先の id(ct.zID) が 0 の場合、未登録と判定して、テーブルに挿入します。
        • 65行:INSERT_KU定数から、Insert 文を生成します。
        • 66-70行:Insert 文を実行します。
          INSERT_KU の"?" には、C連絡先の各フィールドの値が設定されます。
      • 71-78行:連絡先の id が 0 でない場合、その id に該当する行のデータを更新します。
        • 72行:UPDATE_KU定数から、Update 文を生成します。
        • 73-78行:Update 文を実行します。

  4. データ変換のための拡張
    NSDate や NSImage を拡張して、データベーステーブルの列定義に合わせて型変換を行う機能を追加します。
    /Util/Util.swift :
    • 10-19行:NSDate を拡張して、shortDate プロパティで、NSDate型を "yyyy/MM/dd" 形式の文字列に変換できるようにします。
    • 51-68行:NSImage を拡張して、base64String プロパティで、イメージを Base64 文字列に変換できるようにします。
    • 21-49行:String を拡張して、nsDate プロパティで文字列を NSDate型に、image プロパティで文字列を NSImage に変換できるようにします。

  5. 連絡先一覧ビューコントローラの修正
    SQLite 版の /Controller/ViewController.swift は以下のようになります:

    • 31行:指定したURI(DB_PATH)でコネクションを生成します。
    • 35行:このコネクションで、データベース定義クラス(ContactDdl)のインスタンスを作成します。
    • 38行:データベース定義クラスの createTable() メソッドにより contacts テーブルを作成します。
    • 45-53行:連絡先リポジトリ(ContactRepo)を生成して、contacts テーブルから登録データを取得します。
      • 46行:findAll() により、登録されているデータを取得します。
      • 47-51行:登録データが0件の場合は、save() により、初期データを2件登録します。
      • 52行:再度 findAll() で、登録データを取得します。取得データは "z連絡先一覧" に入れられます。
    • 76-97行:データソース(NSTableViewDataSource)メソッドの numberOfRowsInTableView(), tableView() では z連絡先一覧からテーブルに表示する件数と、表示データを取得するように修正します。
    • 161-167行:選択行の連絡先データもz連絡先一覧から取得するように変更します。
    • 注意:このサンプルでは、[+]ボタンアクション(addContact)、[-]ボタンアクション(deleteContact)にデータベース処理を実装していません。

  6. 詳細ビューコントローラの修正
    上述の通り、データベースとのデータのやりとりは全て ViewController で行っています。
    モデルに新しく追加した項目を扱えるように、DetailViewController.swift を次のように修正します:

結果を確認

mydb.db データベースと、contacts テーブルを作成して、テーブルに初期データを2件登録(save())するように、ベースアプリケーションを修正しました。さらにテーブルビューのデータソースは contacts テーブルから、登録データを取得(findAll())するように修正しました。
  • アプリケーションを実行して、データベースに対する処理が思い通りに機能しているか確認します:


  • 管理ツールを使って作成された contacts テーブルと登録データを表示します:



0 件のコメント:

コメントを投稿