안녕하세요.
오늘은 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"
}
}
Realm에 모델 속성에는 @objc dynamic를 붙여야 한다고 합니다.
왜냐하면 데이터베이스의 데이터에 대한 속성 접근자를 만들기 위해서입니다.
접근자를 만들어야 데이터베이스의 데이터에 접근이 가능합니다.
do {
let realm = try Realm()
// 데이터 추가
try realm.write {
realm.add(task)
}
} catch let error {
print(error)
}
do {
let realm = try Realm()
// 기본키를 지정했다면, 기본키가 같다면 Update가 되고 기본키가 없으면 Create된다.
try realm.write {
realm.add(task, update: .modified)
}
} catch let error {
print(error)
}
var realmEntityTaskList = [RealmEntityTask]()
do {
let realm = try Realm()
// 데이터 가져오기
let fetchDataList = realm.objects(RealmEntityTask.self)
// 가져온 데이터를 할당
fetchDataList
.forEach {
realmEntityTaskList.append($0)
}
} catch let error {
print(error)
}
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)
}
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)
}
감사합니다!