単純データストア

3083 ワード

iOSの開発では、ユーザーのデータを記憶する必要があり、次回の使用に便利であるため、データ記憶方法を用いる必要がある.

1.plistストレージ


メリット:ストレージパスを手動で管理し、システムの削除を避けることができます.
欠点:アクセスが煩雑で、オブジェクトを格納できない.
保存:
   // 
   NSArray *arr = @[@123,@"dl"];
   // 
   NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
  // 
  path = [path stringByAppendingPathComponent:@"arr.pilst"];
   // 
  [arr writeToFile:path atomically:YES];

取得:
  // 
  NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
  // 
  path = [path stringByAppendingPathComponent:@"arr.pilst"];
  // 
  [NSArray arrayWithContentsOfFile:path];

2.設定記憶


メリット:ストレージパスに関心を持つ必要はありません.
欠点:システム管理、プログラム猿は手動で管理できず、オブジェクトを保存できない
保存:
    // 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // 
    [defaults setObject:name forKey:@"name"];

**取:**
    // 
    NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];

3.カスタムオブジェクトストレージ


メリット:任意のコンテンツを格納、パスを手動で管理できる.
欠点:多くの方法を実現する必要があり、比較的煩雑である.
保存:
1.ストレージをクリックすると、配列データがアーカイブされます.
    // 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    
    AddViewController *vc = segue.destinationViewController;
    
    vc.block = ^(DLContact *contact){
        
        [_contacts addObject:contact];
        // 
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contact.data"];
        
        NSLog(@"%@",path);
        // 
        [NSKeyedArchiver  archiveRootObject:_contacts toFile:path];
        
        [self.tableView reloadData];
    };   
}

2.モデルクラスでencodeWithCoderを書き換える:およびinitWithCoder:メソッドアーカイブとアーカイブを必要とするモデル属性にアーカイブとアーカイブを設定する
アクセス方法の実装:
// key
- (void)encodeWithCoder:(NSCoder *)aCoder{
    
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:_phone forKey:@"phone"];
    
}
// key 
- (instancetype)initWithCoder:(NSCoder *)aDecoder
    {// 
    if (self = [super init]) {
        
        _name = [aDecoder decodeObjectForKey:@"name"];
        _phone = [aDecoder decodeObjectForKey:@"phone"];     
    }
    return self;
}

3.配列リロード方法でアーカイブ解除後のデータを読み込む
取得:
- (NSMutableArray *)contacts{
    // 
    if (_contacts == nil) {
          // 
          NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contact.data"];
          // 
        _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
         // 
        if (_contacts == nil) {
            // 
            _contacts = [NSMutableArray array];
        }   
    }
    return _contacts;
}
 : , !
Tips: block .