ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Realm List, EmbededObject
    🍎iOS 2022. 10. 23. 01:43

     

    Realm List

    테이블 안에 테이블 넣기

    1. 테이블 안에 넣기
    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

    테이블에 테이블 임베드 하기

    1. 테이블에 추가해주기
    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 = config
    

     

    3. 특정 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 등

     

Designed by Tistory.