광어네 맛집

[CoreData] Relationships (+ SQLiteBrowser) _ 03 본문

Swift/About Swift

[CoreData] Relationships (+ SQLiteBrowser) _ 03

Lautner Jacob 2022. 6. 2. 17:23
728x90
반응형

요즘 날씨가 왔다리 갔다리...

왜이렇게 더운지 

무튼 ! 이번 포스팅은 예전 포스팅과 연결하여

SQLite 보는 툴 및 Relationships에 대해서 적어보자 합니다!

 


 

이전 포스팅 마지막에서 SQlite로 데이터를 저장하고 위치까지 알아봤죠?

그럼 SQLite는 어떻게 열어보냐?

 

바로 SQLiteBrowser를 이용해서 열어보시면 됩니다!

다운로드 사이트는 https://sqlitebrowser.org/dl/ 

 

Downloads - DB Browser for SQLite

(Please consider sponsoring us on Patreon 😄) Windows Our latest release (3.12.2) for Windows: Windows PortableApp Note - If for any reason the standard Windows release does not work (e.g. gives an error), try a nightly build (below). Nightly builds ofte

sqlitebrowser.org

 

들어가보면 MacOS도 있고 homebrew도 있으니

모두들 편할걸로 하셔요~ (저는 brew로 편하게 했어여)

 

꼭 교과서 로직에 나올 법한 아이콘이 생겨요

이걸 클릭하고 앱 주소에 저장되어 있는

SQLite를 Drag & Drop하게 되면 아래처럼 볼 수 있습니다!



 


 

자 다시 Xcode로 돌아와서 Relationships에 대해서 살펴봅니다!

저는 사람이 별명 1, 별명 2를 가지게 될 상황이 있다는 걸 가정 아래에 만들어봤습니다!

 

Editor Style 변경시 나오는 테이블 구조 (1:M)

 

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 '를 적용해줬어요 (그럼 이후에 같이 삭제되겠죠? ㅎㅎ)

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/HowManagedObjectsarerelated.html#//apple_ref/doc/uid/TP40001075-CH17-SW1

 

Core Data Programming Guide: Creating Managed Object Relationships

Core Data Programming Guide

developer.apple.com

 

자 여기까지 설정해줬으면 진짜 다 했음!

수동으로 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이 편한거구나 생각이 들기도 합니다

그럼 다음 포스팅 때 봐요~ ㅎㅎㅎ

오늘도 화이팅

 

 

혹시 잘못된 내용이 있으면 언제나 댓글 달아주세요 ㅎㅎㅎ

 

 

1. [CoreData]CURD 사용해보기 _ 01

2. [CoreData] 구조 및 위치에 대해서 _ 02

3. [CoreData] Relationships (+ SQLiteBrowser) _ 03

4. [CoreData] Migration _ 04

 

 

 

728x90
반응형