Realm CRUDの実装(作成、Read、更新、削除)


こんにちは!
今日は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)
}
ありがとう!