iOS CoreData

운영 체제: macOS Ventura 13.0.1
사용 버전: Xcode 14.1, Swift, SwiftUI

iOS CoreData를 알아보겠습니다.

CoreData는 Apple에서 제공하는 값을 저장할 수 있는 프레임 워크입니다. DB와 비슷한 점도 있고 다른 점도 있습니다. CoreData는 관계를 나타낼 수 있고, 데이터 저장이 가능합니다.
오늘은 이 CoreData를 적용해 보겠습니다.


File - New - File...을 누릅니다.





Core Data 영역의 Data Model을 선택합니다.






적당한 이름으로 만들어 줍니다. 저는 HistoryModel로 적었습니다.







이런 창이 열립니다.






Entity가 하나의 테이블이라고 생각하시면 됩니다.

Add Entity를 누릅니다.






이런 화면이 나옵니다.

Attribute가 하나의 칼럼입니다.





Entity 이름을 적당하게 변경합니다. 저는 History로 변경했습니다.

Attribute를 +를 눌러서 추가해 줍니다.

적당한 이름을 적고, Type은 알맞은 타입으로 선택합니다. 저는 날짜라서 Date를 선택했습니다.







Swift 파일을 하나 만듭니다.

File - New - File...을 누릅니다.







Swift를 누릅니다.








대충 아무 이름으로 만듭니다. 저는 Persistencecontroller로 만들었습니다.








새로 만든 파일에 아래처럼 class를 만듭니다.






11 번째 줄의 container는 NSPersistentcontainer로 CoreData의 Stack을 만듭니다. 간단하게 CoreData 파일과 앱을 연결시켜 줍니다.

12 번째 줄의 viewContext는 NSManagedObjectContext로 CoreData의 변화를 감지하는 역할을 합니다. 추가하거나 삭제하거나 수정하거나 하는 작업들을 다 감지할 수 있습니다.

17 번째 줄에서 우리가 방금 만든 HistoryModel을 불러옵니다.

18 번째 줄에서 loadPersistentStores로 코어 데이터를 불러옵니다.

23 번째 줄에서 automaticallyMergeschangesFromParent를 설정해 줘서 다른 곳에서 작업한 것과 다른 변경사항이 존재할 때 자동으로 변경사항이 같아지도록 만듭니다.













여기서 persistenceController를 부르고 environment로 하위 View에 넘겨줍니다.








아래 뷰에 CoreData를 사용할 겁니다.









여기에 11 번째 줄처럼 @Environment를 추가하여 App 파일에서 environment로 넘긴 값을 받습니다.

13 번째 줄처럼 @FetchRequest를 작성합니다. FetchRequest는 일반 Query의 Select와 비슷한 역할을 합니다. 데이터를 조회할 때 사용합니다.

NSSortDescriptor는 Order By와 같은 역할을 하며, NSPredicate는 Where 문과 같습니다. 현재는 모든 데이터를 가져올 거라 특정 값을 추출하는 NSPredicate를 사용하지 않은 상태입니다.









body 부분에 20 번째 줄에 Text를 지우고 ForEach를 넣습니다. CoreData에서 가져온 historys를 가지고 Text를 만듭니다.









함수를 하나 만듭니다.

addHistory를 만들고 36 번째 줄처럼 context를 이용하여 History를 만듭니다.

그리고 그 변수 안에 Date를 넣습니다.

coreViewContext.save()로 변경 사항을 저장합니다.








이렇게 만든 함수를 + 버튼을 눌렀을 때, 실행되도록 합니다.

26 번째 줄을 아래와 같이 변경합니다.









아 리스트를 잊었습니다.

리스트를 추가해 주고, toolbar 위치도 변경해 줍니다.










실행해 봅시다.









앱을 종료했다 다시 켜도 2 개가 남아 있습니다.




만약 save를 하지 않는다면 어떻게 될까요?








아래와 같이 생성은 되지만 메모리 상태에서만 변경하므로 앱을 종료 후 다시 켜면 원상 복귀됩니다.







삭제하기를 해봅시다.

delete 또한 save가 필요합니다.









24 번째 줄에 onDelete를 추가합니다. perform에는 위에서 만든 deleteHistory를 적습니다.

33 번째 줄에서는 EditButton()을 넣습니다.








실행해 봅시다.






삭제도 잘 되는 걸 볼 수 있습니다.


rollback은 원래 상태로 돌리는 것이고,

undo와 redo는 undoManager가 필요합니다.

reset은 되돌리는 것이긴 한데, UI가 바로 반영되지 않아서 에러가 생기는 걸로 보이니, reset보다는 Rollback이 더 자주 쓰일 것 같네요.



끝.



카테고리: iOS

댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)