EEYatHo 앱 깎는 이야기

Swift ) Realm - EEYatHo iOS 본문

iOS, Swift

Swift ) Realm - EEYatHo iOS

EEYatHo 2021. 3. 23. 14:45
반응형

 

Realm


  • github 링크
  • NoSQL 데이터베이스
  • UserDefaults, CoreData 같은 로컬 DB
  • 무료인데, 빠르고, 사용하기 쉽다
  • 안드로이드나 Flutter 같은 다른 플랫폼과의 DB 공유도 가능

 

 

설치법


 

 

 

사용법


  • 모델 선언
import RealmSwift

class Alert: Object {
    @objc dynamic var idx: Int = 0
    @objc dynamic var time: String = "00:00"
    @objc dynamic var isOn: Bool = false

    convenience init(time: String) {
        self.init()
        self.time = time
    }
}

 

  • primary key 선언
override static func primaryKey() -> String? {
    return "idx"
}

 

  • create
let instance = try! Realm()

// 새로운 객체 생성
let alert = Alert(time: "11:30")

// write transaction block
try! instance.write { 
    instance.add(alert)
}

 

  • readAll, read
// readAll
let result = instance.objects(Alert.self)
let arr = Array(result) // to Swift Array

// read one (filter)
let query = NSPredicate(format: "idx = %@", 20)
let alert = result.filter(query)

 

  • sort
let sortedAlerts = instance.objects(Alert.self)
    .sorted(byKeyPath: "idx", ascending: true)

 

  • update
    예시 ) 특정 idx 의 alert 를 update 하기
func updateAlert(idx: Int, time: String, isOn: Bool) {
    if let alert = instance.objects(Alert.self).filter(NSPredicate(format: "idx == %d", idx)).first {
        try? instance.write {
            alert.time = time
            alert.isOn = isOn
        }
    } else {
        print("updateAlert not found error")
    }
}

 

  • delete
    예시 ) 특정 idx 의 alert 를 delete 하기
func deleteAlert(idx: Int) {
    if let alert = instance.objects(Alert.self).filter(NSPredicate(format: "idx == %d", idx)).first {
        try? instance.write {
            instance.delete(alert)
        }
    } else {
        print("deleteAlert not found error")
    }
}

 

 

 

 

Realm 특징


  • 특정 객체의 인스턴스를 생성한 후, 해당 객체를 DB 프록시 내에서 변경할 경우, 이미 꺼낸 인스턴스도 업데이트 된다.

  • 메인 쓰레드에서만 transaction block 에 접근 가능하다.
try? instance.write {
    alert.time = time
    alert.isOn = isOn
}

 

  • Auto increment 지원 안해준다.
    직접 구현해야한다.
    예시 ) create + auto increment
func createAlert(time: String, isOn: Bool) {
    var idx = 0
    if let lastAlert = instance.objects(Alert.self).last {
        idx = lastAlert.idx + 1
    }
    let alert = Alert()
    alert.idx = idx
    alert.time = time
    alert.isOn = isOn
    
    try? instance.write {
        instance.add(alert)
    }
}

 

 

 

추가


Realm 모델에 Swift 의 Array 사용하기

 

Realm 에서 List 마이그레이션 하기

 

Comments