iOS アプリでデータを永続化させる方法はいくつかあり、Core Data や SQLite 等のデータベースを使用するかどうかで、選択肢は大きく2つに分かれます。
今回は データベースを使用しないデータの永続化 について説明したいと思います。
目次
- Core Data 以外でデータの永続化する方法
- NSUserDefaults について
- NSKeyedArchiver について
- プロパティリストについて
Core Data 以外でデータの永続化する方法
主に次の3つが iOS アプリでのデータの永続化に使用されています。
- NSUserDefaults
- NSKeyedArchiver
- プロパティリスト
これらの使い方を個別に説明していきたいと思います。
ファイルパス
データは次の何れかの階層へ保存することになります。
永続化を行うのであれば /Documents へファイルの保存を行います。
- /Documents
- アプリがファイルを作成し保存する領域
- /Library/Caches
- アプリが一時的に使用する領域(キャッシュファイル)
- /tmp
- 一時ファイルの保存に使用する領域(テンポラリーファイル)
各ファイルパスのコードは以下のようになります。
[code]
// /Documents
let d_paths = NSSearchPathForDirectoriesInDomains(
.DocumentDirectory,
.UserDomainMask, true)
let documentsPath = d_paths[0]
// /Library/Caches
let c_paths = NSSearchPathForDirectoriesInDomains(
.CachesDirectory,
.UserDomainMask, true)
let cachesPath = c_paths[0]
// /tmp
let tmp = NSTemporaryDirectory()
[/code]
データを datastore.dat ファイルに保存をおこなうサンプルコードは以下のようになります。
NSKeyedArchiver と プロパティリスト でのデータの保存には、このサンプルコードの path を使用し、ファイルへデータの読み書きを行っていきます。
サンプルコード
[code]
let d_paths = NSSearchPathForDirectoriesInDomains(
.DocumentDirectory,
.UserDomainMask, true)
let documentsPath = d_paths[0]
let path = d_paths[0].stringByAppendingPathComponent(“datastore.dat”)
[/code]
NSUserDefaults について
NSUserDefaults については以前に Objective-C で説明した記事 がありますが、ここでは読み書きを行う部分のコードだけをピックアップして説明します。
書き込み
[code]
var user = [
“Name”: “Siro Chro”,
“Age”: “20”,
“Sex”: “male”,
]
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(user, forKey: “User”)
if let success = defaults.synchronize() {
println(“success!”)
} else {
println(“failure!”)
}
[/code]
読み込み
[code]
let defaults = NSUserDefaults.standardUserDefaults();
let user = defaults.dictionaryForKey(“User”)
for (key, value) in user {
println(“\(key):\(value)”)
}
[/code]
NSKeyedArchiver について
NSKeyedArchiver はその名の通り、オブジェクトをアーカイブ(シリアライズ)しデータの保存を行います。
アーカイブとはオブジェクトのデータをバイナリ(0と1)に変換し保存されます。
保存されるデータはバイナリファイルなので、高速に読み書きが可能ですが、オブジェクトを常に一つのバイナリとして扱うため、データが大きくなるに連れメモリ使用量やデータ検索の効率が悪くなります。
このことから、NSKeyedArchiver はデータが10件、20件程度の 少量データの保存に適した方法 だと言えます。
書き込み
定義済みの path(datastore.dat) へ保存を行います。
[code]
var user = [
“Name”: “Siro Chro”,
“Age”: “20”,
“Sex”: “male”,
]
if let success = NSKeyedArchiver.archiveRootObject(user, toFile: path) {
println(“success!”)
} else {
println(“failure!”)
}
[/code]
読み込み
[code]
let user = NSKeyedUnarchiver.unarchiveObjectWithFile(_path) as [String: String]
for (key, value) in user {
println(“\(key):\(value)”)
}
[/code]
プロパティリストについて
プロパティリストとは
プロパティリストは拡張子 .plist というファイルで、その実体は xml です。
xml や json でよく目にする < > や { } などで括られた文字列で構成されており、Max OS X や iOS ではその名の通りプロパティリストとして、アプリの設定が保存されています。
注意点
基本的にプロパティリストに保存を行うデータは NSDictionary 型で行います。
このようにプロパティリストは NSDictionary 型で保存されているため、データを読み込む際は NSDictionary 型の変数を用意する必要があります。
書き込み
[code]
var user = [
“Name”: “Siro Chro”,
“Age”: “20”,
“Sex”: “male”,
]
if let success = user.writeToFile(path, atomically: true) {
println(“success!”)
} else {
println(“failure!”)
}
[/code]
読み込み
NSDictionary を宣言し、読み込みを行います。
[code]
var user = NSDictionary(contentsOfFile: path)
for (key, value) in user {
println(“\(key):\(value)”)
}
[/code]
まとめ
アプリで使用するデータが設定やスコアのみのアプリであれば、今回説明した方法で十分事足りるかと思います。
ユーザーがアプリからデータを保存したり、保存されたデータを使用しなければならない場合は Core Data を利用する必要があります。
次回からは Core Data でのデータの永続化の方法を説明したいと思います。
この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。