2012-01-04 33 views
15

Tôi đang phát triển một ứng dụng sẽ lưu dữ liệu vào hệ thống tệp cục bộ. Dữ liệu sẽ được lưu sẽ chủ yếu là NSString và NSDate. Dữ liệu sẽ không được lưu thường xuyên, có lẽ dữ liệu mới sẽ được nhập 10 lần với cách sử dụng thông thường. Tất nhiên, dữ liệu cũng có thể được truy xuất (CRUD)Chiến lược lưu trữ liên tục trên iOS

Tôi nên lưu dữ liệu này như thế nào? Trước hết là nó cần thiết để mô hình các đối tượng này? Nếu tôi không nên sử dụng danh sách tài sản? Hoặc SQLLite3?

Khác tôi có nên lưu trữ các mô hình lớp học không? Sử dụng SQLLite3?

EDIT: Tôi vô tình để lại một số thông tin quan trọng về ứng dụng. Trên thực tế, ứng dụng của tôi sẽ có 2 mô hình dữ liệu có mối quan hệ tổng hợp. Vì vậy, mô hình dữ liệu đầu tiên của tôi (cho phép gọi nó là DataA) sẽ có NSString và NSDate cũng sẽ có tham chiếu đến mô hình dữ liệu thứ hai (cho phép gọi nó là DataB) mà chính nó sẽ bao gồm một NSString và một NSArray. Bây giờ nó trở nên phức tạp hơn một chút. Nếu một đối tượng từ DataB bị xóa, tất nhiên nó sẽ không còn tồn tại trong DataA nữa (nhưng phần còn lại của DataA sẽ không bị ảnh hưởng)

+0

nếu lượng dữ liệu không lớn, như bạn đang nói .. bạn có thể sử dụng NSUserDefaults ... Nó đơn giản và dễ sử dụng. – Bonnie

Trả lời

17

Loại dữ liệu này rất đơn giản để lưu trữ và truy xuất và không có bất kỳ phụ thuộc như đồ thị đối tượng phức tạp khủng khiếp.

Bạn nên lưu trữ dữ liệu này trong một tệp phẳng hoặc trong NSUserDefaults.

tôi sẽ cung cấp cho bạn một ví dụ của cả hai, sử dụng đối tượng lưu trữ với việc sử dụng các giao thức 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 

Sau đó, nói trong đại biểu ứng dụng của bạn, bạn có thể làm điều này:

@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 

Tuyên bố từ chối trách nhiệm: Tôi chưa thử nghiệm mã này.

+0

Cảm ơn bạn đã trả lời kỹ lưỡng. Trên thực tế, ứng dụng của tôi sẽ có 2 mô hình dữ liệu có mối quan hệ tổng hợp. Vì vậy, mô hình dữ liệu đầu tiên của tôi (cho phép gọi nó là DataA) sẽ có NSString và NSDate cũng sẽ có tham chiếu đến mô hình dữ liệu thứ hai (cho phép gọi nó là DataB) mà chính nó sẽ bao gồm một NSString và một NSArray. Bây giờ nó trở nên phức tạp hơn một chút. Nếu một đối tượng từ DataB bị xóa, tất nhiên nó sẽ chấm dứt tồn tại trong DataA. –

+0

@PeterWarbo Nếu đó là trường hợp, tôi khuyên bạn nên sử dụng dữ liệu cốt lõi bởi vì nó sẽ là cách dễ nhất để làm các nguyên tắc quan hệ tầng và như vậy. Nó sẽ đơn giản để thực hiện, mặc dù tôi hoài nghi về sự cân bằng của việc thiết lập một ngăn xếp dữ liệu cốt lõi chỉ để làm điều đó ... –

+0

Vì vậy, về cơ bản nó tóm tắt hoặc bằng cách sử dụng lưu trữ các mô hình dữ liệu của tôi hoặc sử dụng dữ liệu lõi? –

1

Tôi khuyên bạn nên đi với NSUserDefaults. Đó chắc chắn là cách tiếp cận tốt nhất để lưu trữ thông tin liên quan đến ứng dụng của bạn và bất kỳ dữ liệu liên quan đến ứng dụng nào. Kiểm tra documentation !!

1

NSUserDefault là lựa chọn tốt nếu bạn chỉ có một bộ dữ liệu giới hạn. Nhưng nếu bạn xem xét lọc và tìm nạp, thì bạn nên có một cái nhìn đến Core Data để lưu trữ các đối tượng.

Thậm chí nếu biểu đồ đối tượng ở mức tối thiểu, bạn sẽ được quản lý đối tượng được lưu trong bộ nhớ cache và quản lý hoàn tác/hoàn tác miễn phí.

Các vấn đề liên quan