220
217

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iOS開発でデータの保存をする

Last updated at Posted at 2014-02-14

##データを保存できる領域

データは基本的にフラッシュドライブに保存します。
フラッシュドライブにある領域は大きく以下の3つ。

  • アプリ領域
  • OS領域
  • 共有領域

主に使用するのは「アプリ領域」になります。
(プログラムからアクセスできる領域)

###アプリ領域の構成

アプリで参照できるのはアプリごとに割り振られたホームディレクトリに限られており、/Applications/<GUID>/以下がアプリ領域となります。
(ホームディレクトリはNSHomeDirectory()関数で確認できます)

ホームディレクトリ以下はさらにいくつかのディレクトリに分かれていて、それぞれ目的が異なります。

ディレクトリ 説明
/アプリ名.app メインバンドル。アプリ自体のリソースファイルを保存する
/Documents アーカイブなどファイル単位で永続化する場合に使用
/Library/Caches キャッシュ領域
/Library/Preferences アプリケーションの設定情報を保存するディレクトリ。NSUserDefaultsで使用
/tmp 一時ファイル保存場所

####アプリ名の取得方法

NSLog(@"AppName: %@", [[NSBundle mainBundle] bundlePath]);

####ホームディレクトリ以下へのアクセス

NSArray *paths = NSSearchPathForDirectoriesInDomains([ディレクトリタイプ], NSUserDomainMask, YES);

ディレクトリタイプに定数を渡すことで、上記のそれぞれのディレクトリパスを得ることができます。

  • NSDocumentDirectory
  • NSCachesDirectory

##オブジェクトをシリアライズして保存する

Objective-Cのオブジェクトをシリアライズして、それをファイルに保存する方法。
シリアライズはバイナリ化のこと。
iOSではアーカイブ、アンアーカイブと呼ぶ。
アーカイブするにはNSKeyedArchiverクラス、アンアーカイブするにはNSKeyedUnarchiverクラスを利用する。

###アーカイブできるオブジェクトの種類

  • NSArray
  • NSDictionary
  • NSString
  • NSDate
  • NSNumber
  • NSData
  • NSURL
  • UIView
  • UIViewController
  • ※NSCoding プロトコルに準拠しているクラス

##プロパティリストを使ってデータを保存する

プロパティリストは、「.plist」の拡張子を持つXML形式のファイル。
通称plistファイルとも。

###プロパティリスト形式のデータを保存する

sample.m
- (void)saveToPlistWithArray:(NSArray *)array
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *directory = [paths objectAtIndex:0];
    NSString *filePath = [directory stringByAppendingPathComponent:@"data.plist"];
    
    BOOL successful = [array writeToFile:filePath atomically:NO];
    
    if (successful) {
        LOG(@"%@", @"データの保存に成功");
    }
}

###プロパティリスト形式のデータを読み込む

sample.m
- (void)loadFromPlistWithArray
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *directory = [paths objectAtIndex:0];
    NSString *filePath = [directory stringByAppendingPathComponent:@"data.plist"];
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
    
    if (array) {
        for (NSString *data in array) {
            LOG(@"%@", data);
        }
    }
    else {
        LOG(@"%@", @"データがありません。");
    }
}

##NSUserDefaultsを使ってデータを保存する

NSUserDefaultsに保存できるデータの型は以下。

  • NSString
  • NSNumber
  • NSData
  • NSDate(日付)
  • NSArray
  • NSDictionary
  • NSURL
オブジェクトの型 保存メソッド 取得メソッド
(id型) setObject: forKey: objectForKey:
NSString setObject: forKey: stringForKey:
NSArray setObject: forKey: arrayForKey:
NSArray(文字列) setObject: forKey: stringArrayForKey:
NSDictionary setObject: forKey: dictionaryForKey:
NSData setObject: forKey: dataForKey:
NSDate(日付) setObject: forKey: objectForKey:
NSInteger setInteger: forKey: integerForKey:
float setFloat: forKey: floatForKey:
double setDouble: forKey: doubleForKey:
BOOL setBool: forKey: boolForKey:
NSURL setURL: forKey: URLForKey:

NSUserDefaultsに保存されている値を確認する

以下のようにすることで、保存されているすべてのキーと値を確認することが出来ます。

NSDictionary *dict = [NSUserDefaults.standardUserDefaults dictionaryRespresentation];
NSLog(@"Defaults: %@", dict);

また、以下のようにすることで、該当アプリで設定したもののみを確認することが出来ます。

NSDictionary *dict = [NSUserDefaults.standardUserDefaults persistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
NSLog(@"Defaults: %@", dict);

##Core Dataを使ってデータを保存する

※CoreDataに関しては別記事でまとめているので、以下を参照ください。

##参考記事

220
217
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
220
217

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?