Youngminah/TIL

Realm

Closed this issue · 1 comments

image

image

  • 모바일용 오픈 소스 객체 데이터베이스 라이브러리
  • MongoDB는 NoSQL이다.

장점

  • 쿼리 속도가 빠름.
  • 현업에서 많이 씀 (카카오 등등 많은 모바일 앱)
  • 호환성

CoreData의 한계점

  • 애플을 쓰다가 안드로이드로 바꾸면 CoreData를 쓴다면
  • 데이터를 유지할 수 없다.
  • Realm은 가능함.

Realm에 테이블 만들기 예제

import Foundation
import RealmSwift

class UserDiary: Object {
    
    @Persisted var diaryTtitle: String
    @Persisted var content: String?
    @Persisted var writeDate = Date()
    @Persisted var registerDate = Date()
    @Persisted var favorite: Bool

    @Persisted(primaryKey: true) var _id: ObjectId
    
    convenience init(diaryTitle: String, content: String?, writeDate: Date, registerDate: Date) {
        self.init()
        self.diaryTtitle = diaryTitle
        self.content = content
        self.writeDate = writeDate
        self.registerDate = registerDate
        self.favorite = false
    }
}

Realm에 저장한 테이블 가져오기 예제

let localRealm = try! Realm()
var tasks: Results<UserDiary>!
override func viewDidLoad() {
    super.viewDidLoad()
    tasks = localRealm.objects(UserDiary.self)
    print(tasks[0])
}

image

  • 출력결과

테이블 스키마 구조 자체가 바뀐다면?

  • 마이그레이션이 필요하다
  • 출시 전까지는 앱을 삭제하고 다시 빌드하는 형태로 사용하면 된다.

필터 쿼리

let realm = try! Realm()
// Access all dogs in the realm
let dogs = realm.objects(Dog.self)

// Filter by age
let puppies = dogs.filter("age < 2")

// Filter by person
let dogsWithoutFavoriteToy = dogs.filter("favoriteToy == nil")

// Filter by person's name
let dogsWhoLikeTennisBalls = dogs.filter("favoriteToy.name == 'Tennis ball'")

특정 수정

try! localRealm.write{
    taskToUpdate.diaryTtitle = "수정된 타이틀이예요"
    taskToUpdate.content = "일기를 수정하고 계시네여 !!!!!@@"
    tableView.reloadData()
}

//밑에는 옛날방법
try! localRealm.write {
    localRealm.create(UserDiary.self, value: ["_id" : taskToUpdate._id, "diaryTtitle": "얘만 바꾸고 싶어"], update: .modified)
    tableView.reloadData()
}
  • 위의 예제가 추천하는 방법
try! localRealm.write {
    let update = UserDiary(value: ["_id" : taskToUpdate._id, "diaryTtitle": "얘만 바꾸고 싶어"])
    localRealm.add(update, update: .modified)
    tableView.reloadData()
}
  • 수정한 부분 빼고 나머지는 초기화됨 사라질수 있음 주의!

일괄수정

try! localRealm.write {
        tasks.setValue(Date(), forKey: "writeDate")
        tasks.setValue("일괄수정된 제목입뉘당", forKey: "diaryTtitle")
        tableView.reloadData()
}

삭제

try! localRealm.write {
    //deleteImageFromDocumentDirectory(imageName: "\(row._id).png")
    localRealm.delete(row)
    tableView.reloadData()
}

참고자료