iOS には
プロパティリストと呼ばれるファイル形式があります。
プロパティリストは NSArray や NSDictionary クラスを使って簡単にデータの読み書きができます。
ここでは
プロパティリストを使った基本的なデータの保存方法から自作クラスの
オブジェクトを保存する方法まで説明します。
また
プロパティリストはファイルの
拡張子が .plist になってるため plist ファイルと呼ばれることもあります。
プロパティリスト全体は NSArray または NSDictionary 型で保存する必要があります(おおもとのデータの型が NSArray か NSDictionary でなければならないという意味です)。NSArray や NSDictionary のデータにさらに NSArray または NSDictionary のデータをネストすることもできます。
プロパティリスト形式でデータを保存する
それでは
プロパティリストを使ったデータの保存方法を見ていきましょう。
プロパティリストにデータを保存するには NSArray と NSDictionary クラスの
writeToFile:
メソッドを使います。
以下は 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>
プロパティリスト形式のファイルを読み込む
プロパティリストファイルからデータを読み込むには initWithContentsOfFile:
メソッドを使います。
以下がその例です。
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;
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(@"%@", @"データが存在しません。");
}
プロパティリストはどんなデータを保存するのに向いているのか