iOS에서 자주 사용하는 네 가지 데이터 영구화 방법 소개
1. 속성 목록에 관련된 주요 클래스: NSUserDefaults, 일반적으로 [NSUserDefaults standardUserDefaults]이면 충분합니다.
- @interface User : NSObject <NSCoding>
- @property (nonatomic, assign) NSInteger userID;
- @property (nonatomic, copy) NSString *name;
- @end
사용방법1).분리 접근
- //
- [[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@”userID”];
- [[NSUserDefaults standardUserDefaults] setObject:name forKey:@”name”];
- //
- NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@”userID”];
- NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@”name”];
2).개체별 액세스
- //
- [[NSUserDefaults standardUserDefaults] setObject:self forKey:@”user”];
- //
- 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) 방법을 실현해야 한다.
- @interface User : NSObject <NSCoding>
- @property (nonatomic, assign) NSInteger userID;
- @property (nonatomic, copy) NSString *name;
- @end
- @implementation User
- // , crash
- - (void)encodeWithCoder:(NSCoder *)aCoder;
- {
- //
- [aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@”userID”];
- [aCoder encodeObject:self.name forKey:@"name"];
- }
- - (id)initWithCoder:(NSCoder *)aDecoder
- {
- if (self = [self init])
- {
- // encodeWithCoder ,
- self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue];
- self.name = [aDecoder decodeObjectForKey:@"name"];
- }
- return self;
- }
- //
- + (BOOL)save {
- NSError *error = nil;
- // , Document
- NSString* fileName = [self getFileName];
- NSString* filePath = [self getFilePath];
- if (![[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error]) {
- NSLog(@” ”);
- return NO;
- }
- return [NSKeyedArchiver archiveRootObject:self toFile:[fileName:userId]];
- }
- @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와 함께 데이터 지속성을 달성합니다.
- NSManagedObjectContext *context = [appDelegate managedObjectContext];
- NSError *error;
- NSString *fieldName = [NSString stringWithFormat:@"test%d", i];
- UITextField *theField = [self valueForKey:fieldName];
- NSFetchRequest *request = [[NSFetchRequest alloc] init];
- // , Line 。 Line 。
- NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context];
- [request setEntity:entityDescription];
- // , SQL where lineNum = i
- NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];
- [request setPredicate:pred];
- NSManagedObject *theLine = nil;
- NSArray *objects = [context executeFetchRequest:request error:&error];
- if (objects == nil){
- NSLog(@”There was an error!”);
- // Do whatever error handling is appropriate
- }
- if ([objects count] > 0){ // object ,
- theLine = [objects objectAtIndex:0];
- }
- else { // , .
- theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"
- inManagedObjectContext:context];
- [theLine setValue:[NSNumber numberWithInt:i] forKey:@”lineNum”]; // object ,coredata sqlite
- [theLine setValue:theField.text forKey:@"lineText"];
- [request release];
- }
데이터 추출 절차는 다음과 같습니다.
- Core_Data_PersistenceAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
- NSManagedObjectContext *context = [appDelegate managedObjectContext];
- NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
- inManagedObjectContext:context];
- NSFetchRequest *request = [[NSFetchRequest alloc] init];
- [request setEntity:entityDescription];
- NSError *error;
- NSArray *objects = [context executeFetchRequest:request error:&error];
- if (objects == nil)
- {
- NSLog(@”There was an error!”);
- // Do whatever error handling is appropriate
- }
- // CoreData NSManagedObject ( ), /
- for (NSManagedObject *oneObject in objects)
- {
- NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];
- NSString *lineText = [oneObject valueForKey:@"lineText"];
- }
- [request release];
원본 주소:http://www.cocoachina.com/bbs/read.php?tid=137443
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[iOS] [Objective-C]NSUserDefaults로 데이터 저장하고 싶은 일 화면의 전환 등으로 천이했을 때에 데이터의 인계를 하는 것이 어렵다. 이전 처리를 남기고 싶습니다. 그런 때에 사용할 수 있는 것이 이번에 소개하는 코드 환경 XCode8.1 Swift 2 절차 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.