iOS でプロパティリストを使ったデータの保存方法
iOS でオブジェクトをシリアライズする方法に続き今回もデータ永続化方法の紹介です。
プロパティリストって何?
プロパティリストは Mac OS X や iOS で利用することができるデータ永続化のためのファイル形式です。Mac OS X ではもっぱらユーザの情報を設定するのに使われる事が多く Windows のレジストリのような使われ方をしています。iOS では Info.plist のようにアプリの情報を設定するのに使われることが多いです。
プロパティリスト全体は NSArray または NSDictionary 型で保存する必要があります(おおもとのデータの型が NSArray か NSDictionary でなければならないという意味です)。NSArray や NSDictionary のデータにさらに NSArray または NSDictionary のデータをネストすることもできます。
プロパティリスト形式でデータを保存する
それではプロパティリストを使ったデータの保存方法を見ていきましょう。
以下は NSArray クラスの writeToFile: メソッドを使ったデータ保存の例です。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *directory = [paths objectAtIndex:0]; NSString *filePath = [directory stringByAppendingPathComponent:@"data.plist"]; NSArray *array = [NSArray arrayWithObjects:@"山田太郎", @"東京都中央区", nil]; BOOL successful = [array writeToFile:filePath atomically:NO]; if (successful) { NSLog(@"%@", @"データの保存に成功しました。"); }
保存されたデータは XML 形式で保存されています。実際のデータを見ると以下のようになっています。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <string>山田太郎</string> <string>東京都中央区</string> </array> </plist>
プロパティリスト形式のファイルを読み込む
以下がその例です。
NSArray *array = [[[NSArray alloc] initWithContentsOfFile:filePath] autorelease]; if (array) { for (NSString *data in array) { NSLog(@"%@", data); } } else { NSLog(@"%@", @"データが存在しません。"); }
保存できるデータの種類
さきほども説明した通りおおもとのデータは NSArray か NSDictionary 型でないといけませんがその下の階層に保存できるデータの種類は複数あります。
プロパティリストで保存できるデータの種類は以下の通りです。
- NSString
- NSNumber
実数型、数値型、ブール型に対応 - NSData
- NSDate
- NSArray
- NSDictionary
自作クラスのオブジェクトを保存する
Person *tYamada = [[[Person alloc] init] autorelease]; tYamada.name = @"山田太郎"; Address *yAddress = [[[Address alloc] init] autorelease]; yAddress.zipCode = @"104-0061"; yAddress.state = @"東京都"; yAddress.city = @"中央区"; yAddress.other = @"銀座1丁目"; tYamada.address = yAddress; // 注意!tYamada オブジェクトをそのまま保存することはできない // NSArray *array = [NSArray arrayWithObjects:tYamada, nil]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:tYamada]; NSArray *array = [NSArray arrayWithObjects:data, nil]; BOOL successful = [array writeToFile:filePath atomically:YES]; if (successful) { NSLog(@"%@", @"データの保存に成功しました。"); }
プロパティリストに保存された自作クラスのオブジェクトを読み込む
プロパティリストからデータを読み込む時は NSArray クラスの initWithContentsOfFile: メソッドで NSArray オブジェクトを生成した後、NSKeyedUnarchiver クラスの unarchiveObjectWithData メソッドを使って復元します。
以下はその例です。
NSArray *array = [[[NSArray alloc] initWithContentsOfFile:filePath] autorelease]; if (array) { for (NSData *data in array) { Person *person = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSLog(@"%@", person); } } else { NSLog(@"%@", @"データが存在しません。"); }
プロパティリストはどんなデータを保存するのに向いているのか
プロパティリストの特徴はなんと言っても Property List Editor で手軽にデータの編集ができることです。
댓글 없음:
댓글 쓰기