광어네 맛집
[CoreData] Relationships (+ SQLiteBrowser) _ 03 본문
요즘 날씨가 왔다리 갔다리...
왜이렇게 더운지
무튼 ! 이번 포스팅은 예전 포스팅과 연결하여
SQLite 보는 툴 및 Relationships에 대해서 적어보자 합니다!
이전 포스팅 마지막에서 SQlite로 데이터를 저장하고 위치까지 알아봤죠?
그럼 SQLite는 어떻게 열어보냐?
바로 SQLiteBrowser를 이용해서 열어보시면 됩니다!
다운로드 사이트는 https://sqlitebrowser.org/dl/
들어가보면 MacOS도 있고 homebrew도 있으니
모두들 편할걸로 하셔요~ (저는 brew로 편하게 했어여)
꼭 교과서 로직에 나올 법한 아이콘이 생겨요
이걸 클릭하고 앱 주소에 저장되어 있는
SQLite를 Drag & Drop하게 되면 아래처럼 볼 수 있습니다!
자 다시 Xcode로 돌아와서 Relationships에 대해서 살펴봅니다!
저는 사람이 별명 1, 별명 2를 가지게 될 상황이 있다는 걸 가정 아래에 만들어봤습니다!
Relationships 한쪽을 연결해주면 다른 한쪽도 연결해줘야 합니다!
(자동인듯 자동 아닌 .. ㅋㅋ)
그리고 가장 중요한 Delete Rule, Type이 있습니다!
Delete Rule, Type 설정까지 해줘야 절반은 한거임!
그럼 Type의 종류는 1:1, 1:M 인지 두가지가 있는데 보는 그대로 입니다!
1:1 -> To One
1:M -> To Many
단, 1:1로 지정할 시에 나중에 ' Generated accessors for Table' 주석아래에
@NSManaged 메서드가 자동으로 생기지 않습니다!
보통 기준이 되는 Entities 하위 relationship에 대해서 설정 해줍니다!
저는 Contact에서 property, property2 를 ' To many' 설정을 해줬어요!
그 다음은 삭제 룰 입니다! 총 4가지가 있는데
1. No Action : 반응 없음! ( 관계 유지 )
(Do nothing to the object at the destination of the relationship.)
2. Nullify : 삭제하면 ( 관계 해제 )
(Remove the relationship between the objects, but do not delete either object.)
3. Cascade : 같이 삭제! (연관있을 때)
(Delete the objects at the destination of the relationship when you delete the source.)
4. Deny : 삭제 방지
(If there is at least one object at the relationship destination (employees), do not delete the source object (department).)
자세한 내용은 아래에서 사이트에서 확인가능합니다 !
저는 ' Cascade '를 적용해줬어요 (그럼 이후에 같이 삭제되겠죠? ㅎㅎ)
자 여기까지 설정해줬으면 진짜 다 했음!
수동으로 Entites을 관리해주려면 Editor -> Create NSManagedObject Subclass...를 클릭하면 짜잔
그리고 Contact_CoreDataProperies.swift 에 들어가면
아래처럼 메서드가 잘 만들어져 있는 게 보입니다! ㅎㅎㅎ
그러면 얘네들은 어떻게 사용하냐?
( 이전 시간 포스팅에서 이어서 합니다 )
CoreDataManager -> saveUser 메서드로 오세요!
여기가 어디야 하시면 1편 보고 오세용 ㅜ
func saveUsers(starButton: Bool, name: String, onSuccess: @escaping (Bool) -> ()) {
if let context = context, let entity = NSEntityDescription.entity(forEntityName: contactName, in: context) {
if let users = NSManagedObject(entity: entity, insertInto: context) as? Contact {
// Attribute 입력!
users.starButton = starButton
users.name = name
```
// 추가되는 부분!
let propertyEntity = Property(context: context)
propertyEntity.nickname = "Something String" // 저는 테스트 한다고 '저장은 됨!'으로 입력했어요
users.addToProperty(propertyEntity)
```
contextSave { success in
onSuccess(success)
}
}
}
}
저는 빠르고 이해하기 쉽게 하려고 String을 고정을 줬지만
메서드 프로퍼티로 빼서 사용하세요!
ViewController에서 확인해보면 잘나옵니다! 물론 SQLite Browser 에서도 잘 나오구요
간혹 데이터 저장할 때 만들어진 메서드로 안넣어주면
users.addToProperty(proper)
다음과 같이 NULL 값이 생겨요 ㅜ
그러면 Contact랑 끊겨서 삭제가 안돼 ㅜ
그러니 잘 챙겨주자구요!
참고로 만들어지는 메서드는
Insert ~ , remove ~ , replace ~ , add ~ 4가지가 만들어집니다!
딱보고 이렇게 쓰겠다 이해가 될거에요 ㅎㅎ
삭제는 'Cascade' 적용해놔서 일괄 삭제됩니다! ㅎㅎ
수정도 찾으면 쉽게 하실 수 있어요!
그 다음은 어떻게 꺼내 쓰냐? 가 궁금하실텐데
(이것도 1편이랑 이어서 적어요!)
// 1편 하단 참조!
func getCoreData() {
let contact = CoreDataManager.shared.getUsers()
print(contact)
}
당근 프린트도 잘 됩니다!
아닌데요? 저기 앱주소만 나오고 이상한데요?
이건 Contact + CoreDataProperties 파일을 보면 짐작이 됩니다
초반에 1:M으로 설정해줬죠?
그럼 기본 '클래스'가 아닌 'NSOrderedSet' 형태가 됩니다!
// 1:1 (To one) 일 때
@NSManaged public var property: Property?
// 1:M (To many) 일 때
@NSManaged public var property: NSOrderedSet?
Property 클래스로 되어 있을 땐 타입 캐스팅해서 바로 사용하실 수 있지만
NSOrderedSet 같은 경우는 조금 사용이 달라요 ...
Objective C 의 경우 SetValueKey 해서 사용하지만 Swift는 다음과 같이 사용합니다.
let contact = CoreDataManager.shared.getUsers()
contact.forEach { propertyOrder in
let tempOrder = propertyOrder.property?.array as! [Property]
guard let propertyItem = tempOrder.first else { return }
print("+ property nickname :", propertyItem.nickname ?? "없음")
}
그럼 저장한 값이 잘 나옵니다!
이렇게 쓰기 싫다 하면 Manager에서
[Contact]처럼 [Property] 를 뽑아서 쓸 수도 있어요!
본인이 판단하기 편한걸루 ㅎㅎ
여기서 포스팅이 끝나면 참 좋겠지만
아직 마이그레이션이 남았다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
Realm이 편한거구나 생각이 들기도 합니다
그럼 다음 포스팅 때 봐요~ ㅎㅎㅎ
오늘도 화이팅
혹시 잘못된 내용이 있으면 언제나 댓글 달아주세요 ㅎㅎㅎ
2. [CoreData] 구조 및 위치에 대해서 _ 02
3. [CoreData] Relationships (+ SQLiteBrowser) _ 03
'Swift > About Swift' 카테고리의 다른 글
[ Layer 및 초기화 ] View 그리기 / Graphics Hardware, UIKit, draw(_ rect: CGRect) _ 01 (0) | 2022.08.09 |
---|---|
[CoreData] Migration _ 04 (0) | 2022.06.05 |
[CoreData] 구조 및 위치에 대해서 _ 02 (0) | 2022.05.31 |
[CoreData]CURD 사용해보기 _ 01 (0) | 2022.05.30 |
[Storyboard Priority] Priority Layout (0) | 2022.05.03 |