IOS에는 앱에 데이터를 저장하기 위한 여러가지 방식이 있다.
“사용자의 기본 설정 정보”를 저장하는 데이터베이스
사용자가 라이트모드를 선호하는지, 다크모드를 선호하는지, 매일 알람을 받고 싶은 시간, 실제로 알람을 받고 싶은지 등을 저장하는데 사용
설정창을 만들때는 UserDefaults를 쓰는 것이 좋지만 사용자가 만들어내는 많은 양의 데이터를 저장하기에는 부적합하다.
파일 시스템과 상호작용 할 수 있다. 파일과 디렉토리를 찾고, 만들고 복사하고 이동하는데 사용된다.
보통 컴퓨터는 하드디스크 같은 보조 기억 장치에 파일들을 저장하므로, 파일시스템이란 하드디스크에 있는 데이터를 쉽게 찾고 접근하기 위해 정리하는 체제 이다.
여러 종류가 있지만 파일에 쉽게 접근해 찾을 수 있도록 하드 드라이브를 데이터를 저장하는 작은 유닛으로 나누고 각 유닛에 어떤 데이터가 있는지를 기억하는 방법을 가진다는 공통점이 있다
ios의 파일 시스템은 sandbox라고 불리는 곳에 위치하고 하나의 앱은 샌드박스 내에서만 놀 수 있다.
앱을 설치하면 인스톨러가 sandbox 디렉토리 안에 앱을 위한 여러 Container 디렉토리를 만든다.
이 디렉토리와 파일들에 접근하도록 도와주는 것이 File Manager이다.
1) NSPersistenceStore (영구 저장소 Next Step)
데이터를 저장하는 파일을 나타낸다. 앱에서 코어데이터를 이용하도록 설정할 때 영구 저장소의 이름, 위치, 타입을 지정해야 한다.
NSURL *storeURL = @"/Document/..../AppData";
2) NSPersistentStoreCoordinator (영구 저장소 관리자)
객체의 데이터를 실제로 저장하고 있는 실제 파일(NSPersistentStore)과 앱이 사용하는 객체 모델 사이를 중개한다. 앱은 NSPersistentStoreCoordinator에 직접 접근할 일이 거의 없다. 단지 코어 데이터 실행 환경을 구성할 때 관리자 객체를 생성만 해주면 된다. 하나 이상의 영구 저장소와의 통신을 관리하기 때문에 데이터가 어떻게 저장되는지를 앱으로 부터 감춘다.
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"AppData" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
3) NSManagedObjectContext (관리 객체 컨텍스트)
관리 객체가 존재하는 영역이다. 앱에서는 관리 객체의 생성, 삭제, 편집, 질의 등을 수행하기 위해 NSManagedObjectContext와 통신한다. 객체들의 변경사항을 관리하며 모든 변경 사항을 한꺼번에 저장하거나 경우에 따라서는 rollback 한다. 전체 데이터 작업을 분리하거나 제한하기 위해 하나 이상의 context를 동시에 사용할 수 있다.
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setPersistentStoreCoordinator:psc];
4) NSManagedObjectModel ( 관리 객체 모델)
관리객체는 관리 객체 모델에서 정의한다 . 객체의 리스트, 각 개체와 연결된 속성 리스트, 각 개체 및 속성과 연결된 유효성 검증, 객체 간의 관계를 포함한다.
5) NSManagedObject (관리 객체)
코어데이터 상에서 실제 정보를 담고 있는 객체를 의미한다. 관리 객체를 키와 그 키에 대응하는 타입의 객체를 가진 Dictionary 객체 처럼 생각할 수 있다.
[MOModel setValue:@"Casablanca" forKey:@"movieName"];
[MOModel valueForKey:@"movieName"];
6) NSFetchedResultsController (추가 기능)
Fetch 요청의 결과와 테이블 뷰를 손쉽게 연결 시켜준다. 이 컨트롤러는 Fetch 결과를 섹션과 줄 단위로 리턴하도록 설정할 수 있고 인덱스를 이용해 접근할 수 있다.
테이블 뷰를 구현할 때 필요한 정보를 얻을 수 있는 메서드도 제공하며, 코어 데이터에서 변경 이벤트가 발생하면 이를 감지한 후 delegate 메소드를 이용해 테이블에 반영할 수 있다.
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@"lent" cacheName:nil];
https://developer.apple.com/documentation/coredata
https://velog.io/@nala/iOS-앱에-데이터-저장하기
https://velog.io/@nala/iOS-Core-Data는-대체-무엇인가