-
[iOS] Realm List, EmbededObject🍎iOS 2022. 10. 23. 01:43
Realm List
테이블 안에 테이블 넣기
- 테이블 안에 넣기
class Todo: Object { @Persisted(primaryKey: true) var objectId: ObjectId @Persisted var title: String @Persisted var importance: Int @Persisted var detail: List<DetailTodo> convenience init(title: String, importance: Int) { self.init() self.title = title self.importance = importance } } class DetailTodo: Object { @Persisted(primaryKey: true) var objectId: ObjectId @Persisted var detailTitle: String @Persisted var favorite: Bool convenience init(detailTitle: String, favorite: Bool) { self.init() self.detailTitle = detailTitle self.favorite = favorite } }2. 마이그레이션 대응
let config = Realm.Configuration(schemaVersion: 1) { migration, oldSchemaVersion in if oldSchemaVersion < 1 { //DetailTodo, List 추가 } } Realm.Configuration.defaultConfiguration = config💡 테이블에 컬럼이 추가된 부분은 아래와 같이 버전 명시만 해주면 알아서 대응!
3. 특정 Todo 테이블에 DetailToDo 추가
//하나만 추가 //하나만 가져오기 위해 first 추가 //문자열에 대한 필터 ''를 이용해서 쿼리 적용 guard let task = localRealm.objects(Todo.self).filter("title = '브라키오의 할 일 7'").first else { return } let detail = DetailTodo(detailTitle: "프랭크 사주세요", favorite: false) try! localRealm.write { //특정 테이블의 컬럼에 추가 task.detail.append(detail) } //여러개 추가 guard let task = localRealm.objects(Todo.self).filter("title = '브라키오의 할 일 3'").first else { return } let detail = DetailTodo(detailTitle: "아이스크림 \\(Int.random(in: 1...10))개 주세요", favorite: false) for _ in 1...10 { try! localRealm.write { //특정 테이블의 컬럼에 추가 task.detail.append(detail) } }4. 특정 Todo 테이블 삭제
guard let task = localRealm.objects(Todo.self).filter("title = '브라키오의 할일 7'").first else { return } //작은 범위 테이블 먼저 삭제하고 큰 범위 테이블 삭제하기! try! localRealm.write { localRealm.delete(task.detail) localRealm.delete(task) }💡 detailTodo를 포함하고 있는 레코드를 삭제해야할때 더 작은 범위의 테이블인 Detail을 먼저 삭제해주고 큰 범위의 테이블인 Todo의 레코드를 삭제해주면 됨!
EmbededObject
테이블에 테이블 임베드 하기
- 테이블에 추가해주기
class Todo: Object { @Persisted(primaryKey: true) var objectId: ObjectId @Persisted var title: String @Persisted var importance: Int @Persisted var memo: Memo? //EmbeddedObject는 항상 Optional convenience init(title: String, importance: Int) { self.init() self.title = title self.importance = importance } } //List가 아니기 때문에 ObjectId는 추가 안함 class Memo: EmbeddedObject { @Persisted var content: String @Persisted var date: Date }💡 EmbeddedObject는 항상 Optional!
2. 마이그레이션 해주기
let config = Realm.Configuration(schemaVersion: 1) { migration, oldSchemaVersion in //테이블에 컬럼이 추가된 부분은 아래와 같이 버전 명시만 해주면 알아서 대응 if oldSchemaVersion < 1 { //DetailTodo, List 추가 } if oldSchemaVersion < 2 { //EmbeddedObject 추가 } } Realm.Configuration.defaultConfiguration = config3. 특정 Todo에 Memo 추가
guard let task = localRealm.objects(Todo.self).filter("title = '브라키오의 할일 6'").first else { return } let memo = Memo() memo.content = "이렇게 메모 내용을 추가" memo.date = Date() //특정 테이블의 레코드의 특정 컬럼에 내용 추가 try! localRealm.write { task.memo = memo }4. Memo가 있는 특정 Todo 삭제
guard let task = localRealm.objects(Todo.self).filter("title = '브라키오의 할일 6'").first else { return } //특정 테이블 삭제 try! localRealm.write { localRealm.delete(task) }💡 RealmList는 하나의 레코드에 테이블을 여러개로 배열형태를 쓸 경우에 사용
💡 EmbeddedObject는 하나의 레코드에 하나로 쓸 경우에 사용 상위 테이블에 아예 속해 있는 테이블이기 때문에 삭제할 경우에 상위 테이블을 삭제한다면 알아서 같이 삭제됨!
💡 이미 스위프트 내에서 타입이 Default로 갖고 있는 타입이 있기 때문에 self.init()을 적용해준다면 값을 따로 지정해주지 않아도 값이 들어가는 타입들도 있음! ex) Bool, Date 등
'🍎iOS' 카테고리의 다른 글
[iOS] 스토리보드를 이용했을 때 장단점을 설명하시오. (0) 2022.10.25 [iOS] TableView와 CollectionView의 차이점을 설명하시오. (0) 2022.10.25 [iOS] Firebase, Push Notification, Messaging (0) 2022.10.23 [iOS] Realm Migration (0) 2022.10.13 [iOS] Margin, 데이터베이스 (0) 2022.08.22