본문 바로가기

프로그래밍/아이폰 프로그래밍

19. 데이터 저장, 편집, 정렬 (NSMutableArray)

배열에 저장된 데이터를 프로퍼티 리스트로 저장하는 작업을 해보겠습니다.



DrinkConstatns.h

#define NAME_KEY @"name"

#define INGR_KEY @"ingredients"

#define DIRE_KEY @"directions"





AddDrinkViewController.h

@interface AddDrinkViewController : DrinkDetailViewController {


NSMutableArray *drinkArray;

}


@property (nonatomic,retain) NSMutableArray *drinkArray;






AddDrinkViewController.m

#import "DrinkConstants.h"



@implementation AddDrinkViewController


@synthesize drinkArray;


- (IBAction) save: (id)sender{

// 사용자가 입력한 정보를 새롭게 칵테일 정보 딕셔너리를 생성합니다.

NSMutableDictionary* newDrink = [[NSMutableDictionary alloc] init];

[newDrink setValue:nameTextField.text forKey:NAME_KEY];

[newDrink setValue:ingredientsTextView.text forKey:INGR_KEY];

[newDrink setValue:directionsTextView.text forKey:DIRE_KEY];

// 딕셔너리를 칵테일 배열이 담긴 배열에 추가합니다.

[drinkArray addObject:newDrink];

[newDrink release];

// 데이터를 정렬합니다.

// 칵테일 이름을 기준으로 정렬

// selector 별도로 지정하지 않으면 대소문자 구분해 비교를 합니다. 여기서는 대소문자 구분하지 않습니다.

NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:NAME_KEY ascending:YES selector:@selector(caseInsensitiveCompare:)];

[drinkArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]];

[nameSorter release];

// 칵테일 추가 뷰를 제거

[self dismissModalViewControllerAnimated:YES];

}


- (void)dealloc {

[drinkArray release];

    [super dealloc];

}





리소스 폴더에 위와 같은 DrinkDirections.plist 를 만들어 놔야 합니다.




데이터 저장과 정렬이 되었습니다.----------------------------------------------------------------------------------
하지만 앱을 껏다 키면 데이터가 모두 사라지고 없습니다. 
앱이 종료 되는 시점에서 데이터를 프로퍼티 리스트 파일로 저장시켜 볼까요??


RootViewController.m

- (void)viewDidLoad {

    [super viewDidLoad];


// 종료 이벤트를 노티피케이션 센터에 등록합니다.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

// 배열을 구현하고 데이터를 채워 넣습니다.

//NSMutableArray* tmpArray = [[NSMutableArray alloc] initWithObjects:@"Firecracker",@"Lemon Drop",@"Mojito",nil];

//self.drinks = tmpArray;

//[tmpArray release];

NSString *path = [[NSBundle mainBundle] pathForResource:@"DrinkDirections" ofType:@"plist"];

NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

self.drinks = tmpArray;

[tmpArray release];

self.navigationItem.rightBarButtonItem = self.addButtonItem;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.

    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

}


// 이 메소드를 헤더파일에 선언하세요...

- (void) applicationWillTerminate:(NSNotification *) notification {

// 리스트의 목록을 파일로 저장합니다

// 코드는 시물레이터에서만 사용가능합니다. 디바이스 데이터 저장은 나중에 다뤄보겠습니다.

NSString *path = [[NSBundle mainBundle] pathForResource:@"DrinkDirections" ofType:@"plist"];

[self.drinks writeToFile:path atomically:YES];

}


- (void)viewDidUnload {

// 노티피케이션 등록 해지

[[NSNotificationCenter defaultCenter] removeObserver:self];

}





♨ 앱 종료 노티피케이션은 앱이 정상적으로 종료 되었을때만 받을 수 있습니다. 강제 종료 되는 경우에는 노티피케이션을 받을 수 없습니다. 주의해주세요.