Swift: Core Data を使用しないデータの永続化について

iOS アプリでデータを永続化させる方法はいくつかあり、Core Data や SQLite 等のデータベースを使用するかどうかで、選択肢は大きく2つに分かれます。

今回は データベースを使用しないデータの永続化 について説明したいと思います。

目次

  • Core Data 以外でデータの永続化する方法
  • NSUserDefaults について
  • NSKeyedArchiver について
  • プロパティリストについて

Core Data 以外でデータの永続化する方法

主に次の3つが iOS アプリでのデータの永続化に使用されています。

  • NSUserDefaults
  • NSKeyedArchiver
  • プロパティリスト

これらの使い方を個別に説明していきたいと思います。

ファイルパス

データは次の何れかの階層へ保存することになります。
永続化を行うのであれば /Documents へファイルの保存を行います。

/Documents
アプリがファイルを作成し保存する領域
/Library/Caches
アプリが一時的に使用する領域(キャッシュファイル)
/tmp
一時ファイルの保存に使用する領域(テンポラリーファイル)

各ファイルパスのコードは以下のようになります。

// /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()

データを datastore.dat ファイルに保存をおこなうサンプルコードは以下のようになります。
NSKeyedArchiverプロパティリスト でのデータの保存には、このサンプルコードの path を使用し、ファイルへデータの読み書きを行っていきます。

サンプルコード

let d_paths = NSSearchPathForDirectoriesInDomains(
                                .DocumentDirectory,
                                .UserDomainMask, true)
let documentsPath = d_paths[0]
let path = d_paths[0].stringByAppendingPathComponent("datastore.dat")

NSUserDefaults について

NSUserDefaults については以前に Objective-C で説明した記事 がありますが、ここでは読み書きを行う部分のコードだけをピックアップして説明します。

書き込み

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!")
}

読み込み

let defaults = NSUserDefaults.standardUserDefaults();

let user = defaults.dictionaryForKey("User")

for (key, value) in user {
    println("\(key):\(value)")
}

NSKeyedArchiver について

NSKeyedArchiver はその名の通り、オブジェクトをアーカイブ(シリアライズ)しデータの保存を行います。
アーカイブとはオブジェクトのデータをバイナリ(0と1)に変換し保存されます。

保存されるデータはバイナリファイルなので、高速に読み書きが可能ですが、オブジェクトを常に一つのバイナリとして扱うため、データが大きくなるに連れメモリ使用量やデータ検索の効率が悪くなります。
このことから、NSKeyedArchiver はデータが10件、20件程度の 少量データの保存に適した方法 だと言えます。

書き込み

定義済みの path(datastore.dat) へ保存を行います。

var user = [
    "Name": "Siro Chro",
    "Age": "20",
    "Sex": "male",
]

if let success = NSKeyedArchiver.archiveRootObject(user, toFile: path) {
    println("success!")
} else {
    println("failure!")
}

読み込み

let user = NSKeyedUnarchiver.unarchiveObjectWithFile(_path) as [String: String]
 
for (key, value) in user {
    println("\(key):\(value)")
}

プロパティリストについて

プロパティリストとは

プロパティリストは拡張子 .plist というファイルで、その実体は xml です。
xml や json でよく目にする < > や { } などで括られた文字列で構成されており、Max OS X や iOS ではその名の通りプロパティリストとして、アプリの設定が保存されています。

注意点

基本的にプロパティリストに保存を行うデータは NSDictionary 型で行います。
このようにプロパティリストは NSDictionary 型で保存されているため、データを読み込む際は NSDictionary 型の変数を用意する必要があります。

書き込み

var user = [
    "Name": "Siro Chro",
    "Age": "20",
    "Sex": "male",
]

if let success = user.writeToFile(path, atomically: true) {
    println("success!")
} else {
    println("failure!")
}

読み込み

NSDictionary を宣言し、読み込みを行います。

var user = NSDictionary(contentsOfFile: path)
 
for (key, value) in user {
    println("\(key):\(value)")
}

まとめ

アプリで使用するデータが設定やスコアのみのアプリであれば、今回説明した方法で十分事足りるかと思います。
ユーザーがアプリからデータを保存したり、保存されたデータを使用しなければならない場合は Core Data を利用する必要があります。

次回からは Core Data でのデータの永続化の方法を説明したいと思います。

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

siro:chro 無料ゲーム SQN をリリースしました

img_sqn_00

sirochro 初の無料ゲームアプリ SQN をリリースしました。
記事:SQN: iOS 無料ゲームアプリ SQN - Sequential Numbers をリリース
ちょっとした時間に楽しめる完全無料のゲームなっていますので、是非ダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

Related Contents

Pickup Contents