Realm 기초 - (Swift)Realm 선언부터

Jiny·2023년 11월 15일
1

Realm 기초

목록 보기
2/3

Realm 설치

Realm은 SPM을 지원합니다.

따라서 SPM으로 추가해주시면 보다 쉽게 사용하실 수 있습니다.

import RealmSwift

으로 RealmSwift가 에러나지 않고 추가되면 성공.

Realm 모델 만들기

Realm에 저장할 Object를 하나 만들어 봅시다.

import RealmSwift

class SomeModelObject: Object {
    @Persisted(primaryKey: true) var id: String
    @Persisted var title: String
    @Persisted var desc: String
    @Persisted var isDone: Bool
    @Persisted var date: Date
    @Persisted var optionType: List<Int>
    @Persisted var rootId: String

    convenience init(title: String) {
        self.init()
        self.id = UUID().uuidString
        self.title = title
        self.desc = ""
        self.isDone = false
        self.date = Date()
        self.optionType = List<Int>()
        self.rootId = ""
    }
}

Realm은 Object자체를 하나의 테이블 처럼 보기때문에 한번 생성하면 키값을 추가할때 꼭 마이그레이션 작업을 해줘야합니다.

마이그레이션 없이 키를 추가했다면 앱 크래시의 원인이 될 수 있습니다. ( 다음편에서 다룰예정 )

id 값을 저는 String으로 선언해서 uuid를 썼는데 기본으로 제공하는 ObjectId 타입을 사용하셔도 됩니다.
모델은 모델을 품을 수 있습니다.

import RealmSwift

class RootModelObject: Object {
    @Persisted(primaryKey: true) var key: String
    @Persisted var tasks = List<SomeModelObject>()
  
  convenience init(key: String, tasks: [SomeModelObject]) {
        self.init()
        self.key = key
        self.tasks.append(objectsIn: tasks)
    }
}

Realm은 [] 타입이 아닌 List<>을 지원하고 있습니다.

Data 꺼내기

값을 가지고 오고 싶을때는

func getRootModelObject(forKey key: String) -> RootModelObject? {
    do {
      let realm = try Realm()
      return realm.object(ofType: RootModelObject.self, forPrimaryKey: key)
    }catch {
      print("Error: \(error)")
      return nil
    }
  }

realm을 선언해서 해당하는Object를 Key로 찾아오면되고

    func getObjects() -> Results<RootModelObject>? {
        do {
            let realm = try Realm()
            return realm.objects(RootModelObject.self)
        }catch {
            print("Error: \(error)")
            return nil
        }
    }

이렇게 Object자체가 있는지 확인해볼 수 있습니다.

읽고 쓰고 지우고

아래는 읽고 쓰고 지우고의 예제 코드입니다.

import Foundation
import RealmSwift

class RealmManager {
    static let shared = RealmManager()

    func getRootModelObject(forKey key: String) -> RootModelObject? {
        do {
            let realm = try Realm()
            return realm.object(ofType: RootModelObject.self, forPrimaryKey: key)
        } catch {
            print("Error: \(error)")
            return nil
        }
    }

    func getObjects() -> Results<RootModelObject>? {
        do {
            let realm = try Realm()
            return realm.objects(RootModelObject.self)
        } catch {
            print("Error: \(error)")
            return nil
        }
    }

    func isKeyAlreadyExists(key: String) -> Bool {
        return getRootModelObject(forKey: key) != nil
    }

    func writeRootModelObject(forKey key: String, tasks: [SomeModelObject]) {
        do {
            let realm = try Realm()
            if let existingObject = getRootModelObject(forKey: key) {
                try realm.write {
                    for task in tasks {
                        existingObject.tasks.append(task)
                    }
                }
            } else {
                let rootObject = RootModelObject(key: key, tasks: tasks)
                try realm.write {
                    realm.add(rootObject)
                }
            }
        } catch {
            print("Error: \(error)")
        }
    }

    func deleteSomeModelObjectFromRootModel(rootKeyId: String, someModelId: String) {
        do {
            let realm = try Realm() // Realm 객체 생성
            if let rootObject = getRootModelObject(forKey: rootKeyId) {
                if let index = rootObject.tasks.firstIndex(where: { $0.id == someModelId }) {
                    try realm.write {
                        rootObject.tasks.remove(at: index)
                    }
                }
            }
        } catch {
            print("Error: \(error)")
        }
    }
}

자주쓰는 처리들은 RealmManager을 만들어서 처리하면 더 쉽게 수정할 수 있습니다.

Sample Project

해당 코드는 https://github.com/Kim-Jiny/RealmSample 에서 확인하실 수 있습니다.

profile
iOS developer

0개의 댓글