iOS에서 자주 사용하는 네 가지 데이터 영구화 방법 소개

iOS의 데이터 영구화 방식은 기본적으로 속성 목록, 객체 아카이빙, SQLite3 및 Core Data 등 네 가지가 있습니다.
1. 속성 목록에 관련된 주요 클래스: NSUserDefaults, 일반적으로 [NSUserDefaults standardUserDefaults]이면 충분합니다.
 
   
   
   
   
  1. @interface User : NSObject <NSCoding> 
  2. @property (nonatomic, assign) NSInteger userID; 
  3. @property (nonatomic, copy) NSString *name; 
  4. @end 

 
사용방법1).분리 접근
   
   
   
   
  1. //   
  2. [[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@”userID”]; 
  3. [[NSUserDefaults standardUserDefaults] setObject:name forKey:@”name”]; 

 
   
   
   
   
  1. //   
  2. NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@”userID”]; 
  3. NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@”name”]; 

2).개체별 액세스
   
   
   
   
  1. //   
  2. [[NSUserDefaults standardUserDefaults] setObject:self forKey:@”user”]; 

 
   
   
   
   
  1. //   
  2. User* u = [[NSUserDefaults standardUserDefaults] objectForKey”@”user”]; 

 
2. 객체 아카이빙은 객체 아카이빙을 사용하려면 NSCoding 프로토콜을 사용해야 합니다.대부분의 Object C 대상은 NSCoding 프로토콜에 부합되고 사용자 정의 대상에서 NSCoding 프로토콜을 실현할 수 있다. NSCoding 프로토콜을 실현하려면 두 가지 방법이 있다. - (void) encode WithCoder: (NSCode *) encoder와 - (void) initWithCoder: (NSCoder *) encoder와 동시에 제안 대상도 NSCopying 프로토콜을 실현할 수 있다. 이 프로토콜은 대상을 복제할 수 있고 NSCopying 프로토콜을 실현하려면 - (id) copyWithZone: (NSzone) 방법을 실현해야 한다. 
   
   
   
   
  1. @interface User : NSObject <NSCoding> 
  2. @property (nonatomic, assign) NSInteger userID; 
  3. @property (nonatomic, copy) NSString *name; 
  4. @end 
  5. @implementation User 
  6. //  , crash 
  7. - (void)encodeWithCoder:(NSCoder *)aCoder;  
  8. //   
  9. [aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@”userID”]; 
  10. [aCoder encodeObject:self.name forKey:@"name"]; 
  11. - (id)initWithCoder:(NSCoder *)aDecoder 
  12. if (self = [self init]) 
  13. //   encodeWithCoder ,  
  14. self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue]; 
  15. self.name = [aDecoder decodeObjectForKey:@"name"]; 
  16. return self; 
  17. //   
  18. + (BOOL)save { 
  19. NSError *error = nil
  20. //  , Document  
  21. NSString* fileName = [self getFileName]; 
  22. NSString* filePath = [self getFilePath]; 
  23. if (![[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error]) { 
  24. NSLog(@” ”); 
  25. return NO; 
  26. return [NSKeyedArchiver archiveRootObject:self toFile:[fileName:userId]]; 
  27. @end 

 
3. SQLite3 SQLite는 기원된 삽입식 관계 데이터베이스로 2000년에 D.Richard Hipp에서 발표되었고 응용 프로그램이 데이터를 관리하는 비용을 줄였다. SQLite는 이식성이 좋고 사용하기 쉬우며 작고 효율적이며 믿을 만하다.SQLite는 별도의 프로세스가 아닌 동일한 프로세스 공간을 공유하는 응용 프로그램에 포함됩니다.외부적으로 보면 RDBMS와는 다르지만 프로세스 내부에서는 완전하고 자체적으로 포함된 데이터베이스 엔진이다.삽입식 데이터베이스의 가장 큰 장점은 프로그램 내부에 네트워크 설정도 필요 없고 관리도 필요 없다는 것이다.클라이언트와 서버가 같은 프로세스 공간에서 실행되기 때문이다.SQLite의 데이터베이스 권한은 파일 시스템에만 의존하며 사용자 계정의 개념은 없습니다.SQLite에는 데이터베이스 레벨 잠금이 있고 네트워크 서버가 없습니다.그것이 필요로 하는 메모리는 다른 비용이 매우 적기 때문에 끼워 넣는 장치에 적합하다.네가 해야 할 일은 단지 그것을 정확하게 프로그램에 컴파일하는 것뿐이다.SQLite에 대한 개발 자료가 많기 때문에 여기서 더 이상 자세히 설명하지 않겠습니다.다만 SQLite 라이브러리를 직접 조작하지 않고 일부 소스가 시작된 제3자 라이브러리로 조작하는 것을 권장한다.예: FMDB:https://github.com/ccgus/fmdb.gitSQLite에 대한 포장이 잘 되어 있습니다.
4. Core Data Core Data는 본질적으로 SQLite를 사용하여 데이터를 저장하지만 SQL 문을 작성할 필요가 없습니다.
Core Data를 사용하려면 Xcode의 데이터 모델 편집기에서 개별 엔티티를 설계하고 해당 속성과 관계를 정의해야 합니다.그런 다음 이러한 객체를 조작하여 Core Data와 함께 데이터 지속성을 달성합니다.
 
   
   
   
   
  1. NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
  2. NSError *error; 
  3. NSString *fieldName = [NSString stringWithFormat:@"test%d", i]; 
  4. UITextField *theField = [self valueForKey:fieldName]; 
  5. NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
  6. //   , Line 。 Line 。 
  7. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"  inManagedObjectContext:context]; 
  8. [request setEntity:entityDescription]; 
  9. // , SQL  where lineNum = i 
  10. NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i]; 
  11. [request setPredicate:pred]; 
  12. NSManagedObject *theLine = nil
  13. NSArray *objects = [context executeFetchRequest:request error:&error]; 
  14. if (objects == nil){ 
  15.     NSLog(@”There was an error!”); 
  16.     // Do whatever error handling is appropriate 
  17. if ([objects count] > 0){    // object ,  
  18.     theLine = [objects objectAtIndex:0]; 
  19. else {  // , . 
  20.     theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line" 
  21.                                             inManagedObjectContext:context]; 
  22.     [theLine setValue:[NSNumber numberWithInt:i] forKey:@”lineNum”];  // object ,coredata sqlite 
  23.     [theLine setValue:theField.text forKey:@"lineText"]; 
  24.     [request release]; 

데이터 추출 절차는 다음과 같습니다.
 
   
   
   
   
  1. Core_Data_PersistenceAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
  2. NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
  3. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" 
  4.                                                      inManagedObjectContext:context]; 
  5. NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
  6. [request setEntity:entityDescription]; 
  7. NSError *error; 
  8. NSArray *objects = [context executeFetchRequest:request error:&error]; 
  9. if (objects == nil) 
  10.     NSLog(@”There was an error!”); 
  11.     // Do whatever error handling is appropriate 
  12. // CoreData NSManagedObject ( ), /    
  13. for (NSManagedObject *oneObject in objects) 
  14.     NSNumber *lineNum = [oneObject valueForKey:@"lineNum"]; 
  15.     NSString *lineText = [oneObject valueForKey:@"lineText"]; 
  16. [request release]; 

 
 
원본 주소:http://www.cocoachina.com/bbs/read.php?tid=137443

좋은 웹페이지 즐겨찾기