iOSアプリケーションデータストレージ

23736 ワード

iOS開発では、データをローカルに格納する必要があることがよくあります.例えば、一部のデータのキャッシュや、ユーザーのアカウントパスワードを記録したり、次回自動ログインするかどうかを記録したりするなど、データをローカルに記録する必要があります.iOSでは、データをローカルに格納する一般的な方法は3つあります.
一:plistを使用してローカルに格納する;
二:Preference(選好設定)
三:アーカイブ解除.
例を挙げて3つの方法を紹介します.
データストレージを紹介する前にiOSのappの砂箱メカニズムを理解する必要があります
方法1:
plistを使用してデータをローカルに格納します.実際には、xml形式で保存されたファイルにデータを書き込みます.plistを使用してデータを格納するのは便利です.コードは次のとおりです.
//       
    NSString *home = NSHomeDirectory();
    NSLog(@"home = %@",home);
    NSString *docPath = [home stringByAppendingPathComponent:@"Documents"];
    //     
    NSString *filePath = [docPath stringByAppendingPathComponent:@"data.plist"];
    
    NSArray *data = @[@"test",@10,@"lalala"];
    [data writeToFile:filePath atomically:YES];

保存したデータコードをplistファイルから読み出すには、次のようにします.
//       
    NSString *home = NSHomeDirectory();
    NSString *docPath = [home stringByAppendingPathComponent:@"Documents"];
    //     
    NSString *filePath = [docPath stringByAppendingPathComponent:@"data.plist"];
    NSArray *data = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@",data);

注意が必要なのは、plistを使用してデータを保存することです.NSStringNSArrayNSDictionaryなど、Foundationフレームワークに付属しているクラスにのみ適用されます.データを保存する場合は、オブジェクトを呼び出すwriteToFileメソッドでファイルを書き込み、データを読み込む場合は、オブジェクトを呼び出す...WithContentsOfFileメソッドでファイル内容を読み込みます.
方式2:
プリファレンス設定の本質は、実際にはplist方式でデータを格納することである.
データコードを保存するオプション:
//   NSUserDefaults,             (Library/Preferences)
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    [defaults setObject:@"test" forKey:@"account"];
    [defaults setObject:@"121" forKey:@"password"];
    [defaults setInteger:10 forKey:@"age"];
    [defaults setBool:YES forKey:@"rember"];
    
    //     ,           
    [defaults synchronize];

優先設定データコードの読み込み:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *account = [defaults objectForKey:@"account"];
    NSInteger age = [defaults integerForKey:@"age"];
    BOOL rember = [defaults boolForKey:@"rember"];
    NSLog(@"%@  %ld  %d",account,age,rember);

コードから分かるように、プリファレンス設定とplistの違いは、ディレクトリやファイル名を取得する必要がなく、プリファレンス設定を使用してデータを保存することです.実際、好み設定でデータを保存する場合、新規ファイルを作成することはできず、1つの固定ファイルにしか保存できません.
また,好み設定の本質はplist保存であるため,Foundationフレームワークに付属するクラスしか保存できないのか,一定の限界がある.
方式3:
アーカイブ解除.
この方式は、NSCodingプロトコルに準拠した任意のオブジェクトをファイルに書き込むことができ、ファイルに書き込まれたデータが乱符号化され、一定の暗号化効果がある.
NSCodingプロトコルを実装するには、実装が必要です-(void)encoderWithCoder:(NSCoder*)encoder および-(id)initWithCoder:(NSCoder*)decoderの2つの方法.
例は次のとおりです.
/**
 *               
 *                   
 */
- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:_name forKey:@"name"];
    [encoder encodeInteger:_age forKey:@"age"];
    [encoder encodeDouble:_height forKey:@"height"];
}
/**
 *               
 *                   
 */
- (id)initWithCoder:(NSCoder *)decoder
{
    if(self = [super init]){
        _name = [decoder decodeObjectForKey:@"name"];
        _age = [decoder decodeIntForKey:@"age"];
        _height = [decoder decodeDoubleForKey:@"height"];
    }
    return self;
}

モデルオブジェクトに対してアーカイブされたコード:
Persion *person = [[Persion alloc] init];
    person.name = @"test";
    person.age = 15;
    person.height = 1.70;
    
    //       
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ];
    NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"];
    
    [NSKeyedArchiver archiveRootObject:person toFile:filePath];

モデルオブジェクトをアーカイブする方法:
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ];
    NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"];
    
    Persion *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@   %d   %f",person.name,person.age,person.height);