2012-01-04 6 views
15

데이터를 로컬 파일 시스템에 저장하는 앱을 개발 중입니다. 저장 될 데이터는 대부분 NSString 및 NSDate입니다. 데이터가 자주 저장되지는 ​​않습니다. 새 데이터는 일반적인 용도로 10 회 입력됩니다. 데이터는 물론 검색 가능해야합니다 (CRUD)iOS 영구 저장 전략

이 데이터를 어떻게 저장해야합니까? 우선 이러한 객체를 모델링해야합니까? 등록 정보 목록을 사용해야합니까? 또는 SQLLite3?

그렇다면 클래스 모델을 보관해야합니까? SQLLite3을 사용 하시겠습니까?

편집 : 실수로 앱에 대한 중요한 정보가 누락되었습니다. 실제로 내 애플 리케이션은 집계 관계가있는 2 데이터 모델을 가지고있을 것입니다. NSString과 NSDate가있는 첫 번째 데이터 모델 (DataA라고도 함)은 NSString과 NSArray로 구성되는 두 번째 데이터 모델 (DataB라고도 함)에 대한 참조를 갖습니다. 그래서 지금은 좀 더 복잡해집니다. DataB의 객체가 삭제되면 당연히 DataA에 존재하지 않아야합니다 (단 DataA의 나머지 부분은 그대로 둡니다).

+0

데이터 양이 많지 않다면, 말하지만 NSUserDefaults를 사용할 수 있습니다 ... 간단하고 사용하기 쉽습니다. – Bonnie

답변

17

이러한 종류의 데이터는 저장 및 검색이 매우 간단하고 다른 데이터는 없습니다. 무시 무시하게 복잡한 객체 그래프와 같은 의존성.

이 데이터는 플랫 파일이나 NSUserDefaults에 저장해야합니다.

나는 NSCoding 프로토콜을 사용하여 객체 보관을 사용하여, 당신은 모두의 예를주지 : 그럼

@interface ApplicationData <NSCopying, NSCoding> {} 

@property (nonatomic, strong) NSDate *someDate; 
@property (nonatomic, strong) NSDate *someOtherDate; 

@property (nonatomic, copy) NSString *someString; 
@property (nonatomic, copy) NSString *someOtherString; 

@end 

@implementation ApplicationData 

@synthesize someDate = _someDate, someOtherDate = _someOtherDate, someString = _someString, someOtherString = _someOtherString; 

- (NSArray *)keys { 
    static dispatch_once_t once; 
    static NSArray *keys = nil; 
    dispatch_once(&once, ^{ 
     keys = [NSArray arrayWithObjects:@"someString", @"someOtherString", @"someDate", @"someOtherDate", nil]; 
    }); 
    return keys; 
} 

- (id) copyWithZone:(NSZone *) zone { 
    ApplicationData *data = [[[self class] allocWithZone:zone] init]; 
    if(data) { 
     data.someString = _someString; 
     data.someOtherString = _someOtherString;  

     data.someDate = _someDate; 
     data.someOtherDate = _someOtherDate; 
     //... 
    } 
    return data; 
} 

- (void) encodeWithCoder:(NSCoder *) coder { 
    [super encodeWithCoder:coder]; 

    NSDictionary *pairs = [self dictionaryWithValuesForKeys:[self keys]]; 

    for(NSString *key in keys) { 
     [coder encodeObject:[pairs objectForKey:key] forKey:key]; 
    } 
    } 


    - (id) initWithCoder:(NSCoder *) decoder { 
    self = [super initWithCoder:decoder]; 
    if(self) { 
     for(NSString *key in [self keys]) { 
      [self setValue:[decoder decodeObjectForKey:key] forKey:key]; 
     } 
    } 
    return self; 
    } 

    @end 

이 응용 프로그램 위임에 말을, 당신은이 작업을 수행 할 수 있습니다

@interface AppDelegate (Persistence) 

@property (nonatomic, strong) ApplicationData *data; 

- (void)saveApplicationDataToFlatFile; 
- (void)loadApplicationDataFromFlatFile; 
- (void)saveApplicationDataToUserDefaults; 
- (void)loadApplicationDataFromUserDefaults; 

@end 

@implementation AppDelegate (Persistence) 
@synthesize data; 

- (NSString *)_dataFilePath { 
    static NSString *path = nil; 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
    path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) stringByAppendingPathComponent:@"xAppData.dat"]; 
    }); 
    return path; 
} 

- (void)loadApplicationDataFromUserDefaults {   
    NSData *archivedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"appData"]; 
    self.data = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

- (void)saveApplicationDataToUserDefaults { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.data]; 
    [[NSUserDefaults standardUserDefaults] setObject:archivedData forKey:@"appData"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

- (void)loadApplicationDataFromFlatFile { 
    NSData *archivedData = [NSData dataWithContentsOfFile:[self _dataFilePath]]; 
    self.data = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

- (void)saveApplicationDataToFlatFile { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.data]; 
    [archivedData writeToFile:[self _dataFilePath] atomically:YES]; 
} 

@end 

면책 조항 :이 코드를 테스트하지 않았습니다.

+0

철저한 답변 주셔서 감사합니다. 실제로 내 애플 리케이션은 집계 관계가있는 2 데이터 모델을 가지고있을 것입니다. NSString과 NSDate가있는 첫 번째 데이터 모델 (DataA라고도 함)은 NSString과 NSArray로 구성되는 두 번째 데이터 모델 (DataB라고도 함)에 대한 참조를 갖습니다. 그래서 지금은 좀 더 복잡해집니다. DataB의 객체가 삭제되면 물론 DataA에 존재하지 않아야합니다. –

+0

@PeterWarbo 그렇다면 핵심 데이터를 사용하는 것이 좋습니다. 관계형 규칙 등을 연쇄 적으로 처리하는 가장 쉬운 방법이기 때문입니다. 코어 데이터 스택을 설정하는 것의 절충에 대해 회의적이지만, 구현하기에 더러워야합니다. –

+0

기본적으로 내 데이터 모델의 보관을 사용하거나 코어 데이터를 사용하는 것까지 기본적으로 종결 되나요? –

1

나는 당신이 NSUserDefaults과 함께 할 것을 제안합니다. 앱 및 앱 관련 데이터와 관련된 정보를 저장하는 가장 좋은 방법입니다. documentation을 확인하십시오!

1

제한된 데이터 세트 만있는 경우 NSUserDefault는 좋은 선택입니다. 하지만 필터링 및 페칭을 고려하면 코어 데이터에서 객체를 저장해야합니다.

개체 그래프가 최소 인 경우에도 캐시 된 개체 관리와 자유로운 실행 취소/다시 실행 관리를 얻을 수 있습니다.