サンドボックスアクセスデータ

19787 ワード

一.サンドボックス構造の適用


Documents:アプリケーションの実行時に生成された永続化が必要なデータを保存し、iTunesがデバイスを同期するとそのディレクトリをバックアップします.例えば、ゲームアプリケーションは、ゲームアーカイブをこのディレクトリに保存することができる.
tmp:アプリケーションの実行に必要な一時データを保存し、使用が完了したら、対応するファイルをディレクトリから削除します.アプリケーションが実行されていない場合、ディレクトリの下のファイルが消去されることもあります.iTunes同期デバイスでは、このディレクトリはバックアップされません.
Library/Caches:アプリケーションの実行時に生成された永続化が必要なデータを保存し、iTunesがデバイスを同期するときにディレクトリをバックアップしません.一般的なストレージ容量が大きい、バックアップを必要としない重要でないデータLibrary/preference:アプリケーションのすべてのプリファレンス設定を保存し、iOSのSettings(設定)アプリケーションはこのディレクトリでアプリケーションの設定情報を検索します.iTunesがデバイスを同期すると、ディレクトリがバックアップされます.

・砂箱カタログを適用する一般的な入手方法


砂箱ルートディレクトリ:NSString*home=NSHomeDirectory()
Documents:(2方式)
新しいバージョンのオペレーティングシステムでは、ディレクトリ名が変更される可能性があるため、砂箱ルートディレクトリの「Documents」文字列を使用することは推奨されません.
1 NSString *home = NSHomeDirectory();
2 NSString *documents = [home stringByAppendingPathComponent:@"Documents"];

NSSearchPathForDirectoriesInDomains関数を使用
1 //NSUserDomainMask  
2 // YES  “~”
3 NSArray*array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, NO);
4 //  iOS , , 
5 NSString*documents = [array objectAtIndex:0];

 
tmp:NSString *tmp = NSTemporaryDirectory();
Library/Caches:(Documentsに似た2つの方法)
砂箱ルートディレクトリによる「Caches」文字列NSSearchPathForDirectoriesInDomains関数(関数の2番目のパラメータをNSCachesDirectoryに変更)Library/preference:NSUserDefaultsクラスを介してディレクトリの下の設定情報にアクセス

二、アーカイブとリカバリ(復号)


1.属性リスト


属性リストはXML形式のファイルで、拡張名はplistです.
オブジェクトがNSString、NSDictionary、NSArray、NSData、NSNumberなどのタイプであれば、writeToFile:atomically:メソッドを使用してプロパティリストファイルに直接オブジェクトを書き込むことができます.

2.NSDictionaryのアーカイブ


NSDictionaryオブジェクトをplistプロパティリストにアーカイブします.
1 //  
2 NSMutableDictionary *dict =[NSMutableDictionary dictionary];
3 [dict setObject:@" "forKey:@"name"];
4 [dict setObject:@"15013141314"forKey:@"phone"];
5 [dict setObject:@"27" forKey:@"age"];
6 
7 //  Documents/stu.plist 
8 [dict writeToFile:path atomically:YES];

3.NSDictionaryの復元


属性リストを読み込み、NSDictionaryオブジェクトを復元します.
1 //  Documents/stu.plist , NSDictionary
2 NSDictionary*dict = [NSDictionary dictionaryWithContentsOfFile:path];
3 NSLog(@"name:%@",[dict objectForKey:@"name"]);
4 NSLog(@"phone:%@",[dict objectForKey:@"phone"]);
5 NSLog(@"age:%@",[dict objectForKey:@"age"]);

4.選好設定


多くのiOSアプリケーションは、ユーザー名、パスワード、フォントサイズなどの設定を保存するなどの設定をサポートしています.iOSは、アプリケーションに設定機能を追加するための標準的なソリューションを提供しています.
各アプリケーションにはNSUserDefaultsインスタンスがあり、これによって好みの設定にアクセスします.たとえば、ユーザー名、フォントサイズ、自動ログインの有無を保存します.
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
2 [defaultssetObject:@"zhangsan" forKey:@"username"];
3 [defaultssetFloat:18.0f forKey:@"text_size"];
4 [defaultssetBool:YES forKey:@"auto_login"];

前回保存した設定の読み込み
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
2 NSString *username = [defaults stringForKey:@"username"];
3 floattextSize = [defaults floatForKey:@"text_size"];
4 BOOLautoLogin = [defaults boolForKey:@"auto_login"];

注意:UserDefaultsがデータを設定するときは、すぐに書き込むのではなく、タイムスタンプのタイミングでキャッシュ内のデータをローカルディスクに書き込みます.したがってsetメソッドを呼び出すと、ディスクアプリケーションにデータが書き込まれずに終了する可能性があります.以上の問題が発生した場合、synchornizeメソッドを呼び出して強制的に書き込むことができます.
1 [defaults synchornize];

5. NSKeyedArchiver


オブジェクトがNSString、NSDictionary、NSArray、NSData、NSNumberなどのタイプの場合は、NSKeydArchiverで直接アーカイブおよびリカバリできます.
すべてのオブジェクトが直接この方法でアーカイブできるわけではなく,NSCodingプロトコルを遵守したオブジェクトのみが可能である.
NSCodingプロトコルには2つの方法があります.
EncodeWithCoder:このメソッドは、オブジェクトをアーカイブするたびに呼び出されます.一般にこのメソッドでは、オブジェクト内の各インスタンス変数をどのようにアーカイブするかを指定します.encodeObject:forKey:メソッドを使用してインスタンス変数をアーカイブできます.
initWithCoder:このメソッドは、ファイルからオブジェクトを復元(復号)するたびに呼び出されます.一般的にこのメソッドでは、ファイル内のデータをオブジェクトとするインスタンス変数をどのように復号するかを指定し、decodeObject:forKeyメソッドを使用してインスタンス変数を復号することができる.

6.NSKeydArchiver-アーカイブ

1 //  NSArray Documents/array.archive
2 NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
3 [NSKeyedArchiverarchiveRootObject:array toFile:path];

NSArrayオブジェクトの復元(復号)
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

7.アーカイブの例


Person.h
1 @interfacePerson : NSObject<NSCoding>
2 @property(nonatomic, copy) NSString *name;
3 @property(nonatomic, assign) int age;
4 @property(nonatomic, assign) float height;
5 @end

Person.m 
 1 @implementation : Person
 2 //  
 3 -(void)encodeWithCoder:(NSCoder *)encoder {
 4     [super encodeWithCoder:encoder];
 5     [encoder encodeObject:self.name forKey:@"name"];
 6     [encoder encodeInt:self.age forKey:@"age"];
 7     [encoder encodeFloat:self.height forKey:@"height"];
 8 }
 9 
10 //
11 -(id)initWithCoder:(NSCoder *)decoder {
12     if (self = [super initWithCoder:decoder]) {
13         self.name = [decoder decodeObjectForKey:@"name"];
14         self.age = [decoder decodeIntForKey:@"age"];
15         self.height = [decoder decodeFloatForKey:@"height"];
16     }
17     return self;
18 }
19 @end

 
アーカイブ
1 Person *person = [[Person alloc] init];
2 person.name= @"zhangsan";
3 person.age= 18;
4 person.height= 1.73f;
5 
6 [NSKeyedArchiverarchiveRootObject:person toFile:path];

リカバリ
1 Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

親もNSCodingプロトコルを遵守している場合は、次の点に注意してください.
encodeWithCoder:メソッドに[super encodeWithCode:encode];継承されたインスタンス変数も符号化され、アーカイブされていることを確認します.
initWithCoder:メソッドにself=[super initWithCoder:decoder]を付けるべきです.継承されたインスタンス変数も復号化され、リカバリされることを保証します.