Realm CRUD 구현하기 (Create, Read, Update, Delete)

hoBahk·2022년 3월 16일
0

안녕하세요.

오늘은 Realm의 CRUD를 구현한 것을 공유하려고 합니다!

Realm 사용 (CRUD)

모델 설계

class RealmEntityTask: Object {
    enum ProgressStatus: String {
        case todo
        case doing
        case done
    }
    
    @objc dynamic var id: String = ""
    @objc dynamic var title: String = ""
    @objc dynamic var desc: String = ""
    @objc dynamic var deadline: TimeInterval = 0
    @objc dynamic var progressStatus = ProgressStatus.todo.rawValue
    var progressStatusEnum: ProgressStatus {
        get {
            return ProgressStatus(rawValue: progressStatus) ?? .todo
        }
        set {
            progressStatus = newValue.rawValue
        }
    }
    
    // 기본키 지정 
    override static func primaryKey() -> String? {
    	return "id"
    }
}

@objc dynamic 을 붙이는 이유

Realm에 모델 속성에는 @objc dynamic를 붙여야 한다고 합니다.
왜냐하면 데이터베이스의 데이터에 대한 속성 접근자를 만들기 위해서입니다.
접근자를 만들어야 데이터베이스의 데이터에 접근이 가능합니다.

Create

do {
    let realm = try Realm()
    
    // 데이터 추가
    try realm.write {
        realm.add(task)
    }
} catch let error {
    print(error)
}

Create or Update


do {
   let realm = try Realm()
   
   // 기본키를 지정했다면, 기본키가 같다면 Update가 되고 기본키가 없으면 Create된다.
   try realm.write {
       realm.add(task, update: .modified)
   }
} catch let error {
   print(error)
}

Read

var realmEntityTaskList = [RealmEntityTask]()

do {
    let realm = try Realm()
    
    // 데이터 가져오기
    let fetchDataList = realm.objects(RealmEntityTask.self)
    // 가져온 데이터를 할당
    fetchDataList
        .forEach {
            realmEntityTaskList.append($0)
        }
} catch let error {
    print(error)
}

Update

do {
    let realm = try Realm()
    
    // 데이터를 가져와서 필터링
    let task = realm.objects(RealmEntityTask.self)
        .filter { $0.id == id }
    // 데이터 쓰기
    try realm.write {
        task.first?.title = title
        task.first?.desc = description
        task.first?.deadline = deadline.timeIntervalSince1970
    }
} catch let error {
    print(error)
}

Delete

do {
    let realm = try Realm()
    
    // 데이터를 가져와서 필터링
    let task = realm.objects(RealmEntityTask.self)
        .filter { $0.id == id }
    // 데이터 삭제
    try realm.write {
        realm.delete(task.first ?? task[0])
    }
} catch let error {
    print(error)
}

감사합니다!

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글