マーケターのプログラミング日記

東京、シンガポールを経てシリコンバレーで働く、マーケター。英語、プログラミング、データ分析は次世代マーケターの必須スキルだと信じて進む。

SwiftData

オーストラリア出張、第二四半期のレビューと、ブログ更新が途絶えてしまいました。いかんいかん。

人生初のシドニー出張での学びは、”オーストラリア人が仕事しないのはしょうがない”です。ランチから普通にビール飲みます。金曜日は午後3時からみんなオフィスでビール飲みます。天気はいいし、街並みも綺麗、海は近いし、飯もうまい。住める!と思いました。マーケットとして、オーストラリアはアジア太平洋地区に含まれますが、日本・韓国・台湾・香港などのアジア先進国と一緒に考えるのは、違うと思いました。肌感覚としてヨーロッパに近い感じがします。

f:id:yuyutata:20150704212143p:plain

 

今日は、データベースをアプリ内に保存する方法。

どうやら、SwiftDataがオススメとの情報をSwiftサラリーマンさんブログに載っていたので、使ってみます。

以前、dmdbというラッパーも触ってみたのですが、dmdbはObjective-Cで書かれているのに対して、SwiftDataはSwift言語で記述されておりシンプルということなので、こちらを使います。

ryanfowler/SwiftData · GitHub

環境構築:

1) SwiftData-master.zipをダウンロード

2) SwiftData.swiftファイルをプロジェクトにdrag&paste 

3) libsqlite3.dylibをライブラリーに追加

4) Headerファイル(.h)を作成し、 #import "sqlite3.h" と記述

5) Objective-C bridge headerとして作成したHeaderファイルを指定

*(4), (5)はSDKを入れる手順のところで何度か触れているので詳しくは割愛

 

データを入力、出力:

1) Tableをつくる:SwiftDataでCreate Tableする方法。

2) Insertする:SwiftDataでInsertを発行する方法。

3) Selectする:SwiftDataでデータをselectする方法。

*とってもわかりやすいページを見つけたのでリンク貼ります

これに従い、println(uiLabel1.text)で出力すると、以下のように、Insertした時間とともに、アプリを一度閉じてもちゃんと記録されていることが確認できました。

Optional("Test:Admin:2015-07-04 11:50:40 +0000:2015-07-04 11:50:40 +0000")

Optional("Test:Admin:2015-07-04 11:50:40 +0000:2015-07-04 11:50:40 +0000")

Optional("Test:Admin:2015-07-04 12:01:58 +0000:2015-07-04 12:01:58 +0000")

Optional("Test:Admin:2015-07-04 12:13:59 +0000:2015-07-04 12:13:59 +0000")

Optional("Test:Admin:2015-07-04 12:17:19 +0000:2015-07-04 12:17:19 +0000")

 

ポイント

Binding Value:

The provided objects will be escaped and will bind to the '?' characters (in order) in the string of SQL.

'?'はbinding valueと呼ばれるもののようです。これは"SQLのクオリ内に埋め込まれた変数”のこと。以下のように、テーブルのカラム名で値を定義すると、それがbinding valueの中に入って、データベースへ格納されていたのですね。

let name: String = "Test"

let role: String = "Admin"

let sql = "insert into users(name, role, created, modified) values(?, ?, datetime('now', 'localtime'), datetime('now', 'localtime'))"

 

雑感

ひとまず、データをローカルに格納する方法がわかりました。次は、今回はletで定数定義だったので、変数定義にして、サーバーつ繋げてみたいなーと思います。

一歩一歩。