2015年8月11日火曜日

MacでSQLiteの中身を確認

前回CoreDataで保存処理を行ったので、SQLiteに正しく値が格納されているか確認してみようと思います。

.sqliteファイルの置き場所を確認

まずは.sqliteのファイルを探します。
現在はシミュレータでデバッグしているので、Mac内のどこかにファイルがあるはず。
CoreDataのurlを取得しているソースにログを入れて確認してみました。

実行すると以下の様なパスが取得できるので、Finderで該当ファイルを見つけます。
url: file:///Users/ユーザ/Library/Developer/CoreSimulator/Devices/シミュレータID/data/Containers/Data/Application/アプリID/Documents/SingleViewCoreData.sqlite

ターミナルでSQLiteを参照

ターミナルを起動して確認していきます。
まずはsqlite3と入力後、SingleViewCoreData.sqliteファイルをターミナルにドラッグします。
Enterを押せば、SQLiteが起動できます。

日記情報ちゃんと入ってました!
最後に、Diaryテーブルに知らないカラムがあるので調べてみました。
  • Z_PK:プライマリーキー
  • Z_ENT:テーブルID
  • Z_OPT:レコードの更新回数

こうして生身のデータが見られると、デバッグも捗りますね!

CoreDataで保存処理 [Swift]

今回は日記の保存処理について書きます。
テンプレートで入ったCoreDataの構成を変更して、保存処理を実装していきます。

CoreDataの構成変更

まずはGoodThingsDiary.xcdatamodeldファイルを開き、修正前から修正後に書き換えます。

【修正前】
Event
  • timeStamp: Date(optional)

【修正後】
Diary
  • diaryDate: Date
  • photo: String(optional)
  • textData: String(optional)
  • timeStamp: Date

モデルクラスの作成

次にEventのモデルクラスを作成します。
Xcodeで簡易的に作成する方法があります。
  1. プロジェクトのGoodThingsDiary.xcdatamodeldファイルを選択
  2. Editorを選択
  3. Create NSManagedObject Subclass...を選択
  4. Data Modelの"GoodThingsDiary"にチェックを入れ、Nextを選択
  5. Entityの"Event"にチェックを入れ、Nextを選択
  6. ファイルを保存するフォルダを選択
  7. LanguageでSwiftを選択
  8. Createを選択
これで"Diary.swift"と"Diary+CoreDataProperties.swift"という2つのファイルが生成されます。

CoreDataの構成変更に伴う修正

次にCoreDataの構成を変更したことにより、コードの修正が必要になります。
このプロジェクトで修正した部分を抜き出しました。
確かテンプレートのソース部分です。

日記情報の保存処理

最後に日記編集画面で、日記情報の保存を行います。
画面右上にSaveボタンを設置して、タップすることで保存する処理を行います。

これで新たに作成した日記が保存できました!核機能がひとまず完成ですねー

2015年8月10日月曜日

ファイルの保存先と保存方法について [Swift]

以前、端末内の写真を画面に表示する方法 [Swift]を紹介しましたが、今度はアプリ内にその写真を保存する方法を書きたいと思います。
大切な写真は日記として保存しておかないとですからね。

まずはファイルの保存先についてです。

主に4つのディレクトリから、データの種類や取り扱い方によって保存先を決定します。
それぞれの特性に合ってないと、データが消失したり、リジェクトされたりするので、慎重に判断する必要があります。
  1. /Documents:バックアップされる
    ユーザデータを保存する場所。
    ユーザに見せるファイルで、ユーザが作成や編集をしたファイルが該当する。
  2. /Library(/Caches以外):バックアップするか選択できる
    ユーザデータ以外の補助ファイルを保存する場所。
    アプリ固有のユーザに見せたくないファイルが該当する。
  3. /Library/Caches:バックアップされない
    再度ダウンロードしたり、再作成できるキャッシュファイルを保存する場所。
    一時データよりは長期的に保持したいけど、補助ファイルほどでない
    性能改善に適していて、データがいつ消失していても問題ない仕組みにしておく。
    端末容量が逼迫した場合は、起動していない時にシステムから削除されます。
  4. /tmp:バックアップされない
    起動中に必要な一時データを保存する場所。
    起動していない時に定期的にシステムから削除されるが、不要になったファイルは自分で消して容量を圧迫しないようにする。
どこに置く場合も、サブディレクトリを作成して整理整頓した方が、データを管理する上で分かり易くて良いと思います。
もっと詳しく知りたい場合は、プログラミングガイドをご参照下さい!
FileSystemProgrammingGuide.pdf

上記4つのディレクトリパスは、以下のコードで取得できます。


続いて、写真ファイルの保存方法になります。

保存場所として、Documents配下に "Photo" ディレクトリを作成しました。
ファイル名は被らないように "現在日時.png" です。


保存した写真を削除する場合は以下のようにします。


データの管理はアプリ開発でも重要なところだと思うので、慎重かつ綿密に設計すべし!

2015年8月5日水曜日

画像拡大Viewerの実装 [Swift]

写真ってたまに拡大したくなりますよね。
ということで、画像を拡大表示するためのViewer画面を作成していきます。

仕様は以下とします。
  1. 画像の上に透明なボタンを設置
  2. 画像をタップすると、ボタンが検知してViewer画面を表示する。
  3. Viewer画面には画像を表示する。
  4. 画像をピンチアウトすると拡大表示できる。
  5. Viewer画面に閉じるボタンを設置

画像上に透明なボタンを設置
画像が表示されていない場合はViewerを表示したくないので、ボタンを無効にしておきましょう。
画像を設定するメソッド内に実装すると、漏れがなく効率的です。

Viewer画面の作成
storyboardで画面を追加して、以下のような構成にします。

画像を拡大するのにScrollViewを使用します。
ZoomのMinを"1"にすると縮小不可、Maxを"3"にすると3倍までズームできます。
Delegateの設定も忘れずに。

Viewer画面の表示
画面遷移の処理はstoryboardから行います。
透明ボタンの上でcontrolキーを押しながらマウスを移動させて、Viwer画面上で離します。
そして "present modally" を選択すると、モーダル表示の準備ができました。
あとはViewer画面に画像データを渡す処理を実装すればOKです。

閉じるボタンから画面を閉じる
これで一通り完了!

UIAlertControllerを使った確認ダイアログの実装 [Swift]

間を空けたので連投します。
どんなに間を空けようと、何度でも習慣化しようと思ってこのブログを初めました。
大人って色々と忙しいですからね、他に優先すべき事項がいくつも出てきます。
しかし必要だと思っている勉強がやれてないて時ってどこか引っ掛かる、、というか罪悪感が湧いてくるので、事が片付いたら再開します。
どんなに面倒でも粘るぞ!


確認ダイアログの実装を何に使用するかというと、写真削除の確認用になります。
設定した写真を消したいといった時には削除しますが、削除前は念のための確認が必要だと思っています。

仕様は以下です。(写真が表示されている画面より)
  1. ゴミ箱アイコンのボタンを設置
  2. そのボタンを選択すると、写真削除の確認ダイアログを表示
  3. OK選択で、表示している写真を削除
  4. Cancel選択では何もしない
  5. おまけ:ゴミ箱ボタンと、カメラアイコンの写真選択ボタンと同じコントロールを使用する。写真の表示有無によって画像を切り替える。

確認ダイアログの処理
OK→写真削除、Cancel→何もしない

写真の表示有無による、ボタンアイコン切り替え処理
画像の設定時に、アイコン切り替え処理を実施します。
写真あり→ゴミ箱、写真なし→カメラ
上記のメソッドを画像の設定・削除する箇所で呼ぶようにします。

表示アイコンによるボタンタップ処理切り替え
最後に、表示アイコンによってボタンタップ時の処理が切り替わるように修正します。
これでボタンを共有できました。
必要な時に必要なボタンだけ表示される、シンプルなUIがいいですね。

端末内の写真を画面に表示する方法 [Swift]

しばしの夏休みを満喫、更に別のことに熱中してたので...^^; 久々の投稿になります。


引き続き!! 日記編集用に、端末内の写真を表示する処理を実装します。

仕様は以下のようにします。
  1. 写真を表示する領域を設置
  2. カメラアイコンのボタンを設置
  3. そのボタンを選択すると、端末の写真選択画面を表示する
  4. 写真を選択すると選択画面を閉じて、1で設置した領域に写真を表示する

写真を表示する領域を設置
写真の縦横比を保つため、ImageViewのViewのModeを "Aspect Fit" に設定しておく。
カメラアイコンのボタンを設置
カメラアイコンの画像をプロジェクトにドラッグして追加します。
ボタンのImageのプルダウンで、上記の画像を設定すればOKです。

端末から写真データを取得して表示
iOSのUIImagePickerControllerを使用すると、写真選択画面まで用意してくれます。

これで選択した写真が表示されるはずです。おわり