Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

TODOの永続化 #4

Open
ginrou opened this issue Apr 21, 2015 · 0 comments
Open

TODOの永続化 #4

ginrou opened this issue Apr 21, 2015 · 0 comments

Comments

@ginrou
Copy link
Contributor

ginrou commented Apr 21, 2015

TODOアプリを作ってみようシリーズの第3回目の演習課題その2です。

内容

#3 に引き続き、この回ではTODOの永続化を行います。

todo4

目的

  • NSUserDefaultsについて理解する。
  • アプリケーションのライフサイクルについて理解する。

教材

スタート地点

3のゴール地点である、ブランチ delete-todo からブランチを切ってから始めてください。

ゴール地点

ブランチ write-to-userdefauls にチェックアウトすると回答を見ることができます。

アプリの仕様

  • アプリ内で追加したTODOがアプリのプロセスが終了し、再起動した後も残っている(永続化)
  • 削除したTODOはアプリのプロセスが再起動した後に消えている
  • (補足)TODOは10個ほど初期値を与えていましたが、それは与えないようにします。

実装の方針

永続化の仕組みにはローカルDB、ファイルシステム、UserDefaults、サーバーに保存などのやり方が幾つかあります。それぞれの方法について一長一短ありますが、ここでは最も手軽に利用することのできる、NSUserDefualtsを利用します。

初期値の削除

今まで与えていた初期値を与えないようにします。

TODOを新規追加したときにNSUserDefaultsに保存する 2962ad0

UserDefualtsに保存を行うときは、保存したいオブジェクトとユニークなキーを指定して書き込みを行います。(- setObject:forKey: を用います)

また- setObject:forKey: を行ってもすぐにはファイルへの書き込みが行われないので、- synchronize を読んで書き込む必要があります。

NSUserDefaultsの実体はplistファイルとして端末に保存され、アプリの起動時にメモリ上に展開されます。
シミュレータの場合は以下のディレクトリ

/Users/<ユーザー名>/Library/Developer/CoreSimulator/Devices/<シミュレータのUUID>/data/Containers/Data/Application/<アプリケーションのUUID>/Library/Preferences

以下にある

org.punchdrunker.Todo.plist

というファイルがそれに該当します。MacのQuickLookやplutilコマンドでその中身を覗き見ることができます。

2015-04-21 8 47 19 pm

フォルダが探しにくい場合は

viewDidLoadに以下のようなログを仕込むとログにディレクトリが表示されます。

NSLog(@"%@/Preferences", NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject);
plutilコマンド

property list (plist)を扱うためのユーティリティコマンドです。plistの中身を出力したい場合は

plutil -convert <json|xml1|binary1> -o - <plistのパス>

で出力することができます。

アプリ起動時にUserDefaultsに書き込まれた内容を読み込む c78f1d7

アプリの起動時にデータを読み込んでセットします。
NSUserDefaultsからの読み込みは - objectForKey: を用います。

読み込みのタイミングはViewControllerの初期化時が良いでしょう。

TODO削除時にNSUserDefaultsからデータを削除する c179e87

#3 で実装した削除を行ったときに、永続化しているデータの更新を行います。

UserDefaultsを更新する場合は、上書きを行えば削除することができます。

うっかり実装漏れになってしまいそうな点ですが、実際のアプリケーションを作る際は要注意ポイントの一つです。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant