티스토리 뷰

iOS

iOS) Realm 사용하기

Ekko0701 2022. 8. 30. 18:00

UserDefaults와 CoreData에 이어서 Realm을 알아보자.

 

Realm Home

Build better apps, faster

realm.io

Why Use Realm ? 

  • Realm은 Core Data, SQLite보다 심플하다.
  • iOS와 Android 모두 지원한다.
  • Zero-copy 디자인 덕분에 빠르다. 

 

바로 사용해보자

설치

 

Install Realm for iOS, macOS, tvOS, and watchOS — Realm

Realm Database should only add around 5 to 8 MB to your app's download size. The releases we distribute are significantly larger because they include support for the iOS, watchOS and tvOS simulators, some debug symbols, and bitcode, all of which are stripp

www.mongodb.com

SPM(Swift Package Manager) 으로 설치를 진행했다.

 

https://github.com/realm/realm-swift.git

위 깃주소를 우상단 복사 붙여 넣기

 

Realm, RealmSwift 체크 후 Add Package

 

👍

 

Realm Studio 설치

Realm Studio는 데이터 베이스 파일을 시각적으로 보고, 편집하고, 디자인할 수 있는 도구이다.

 

Install Realm Studio — Realm

If you want a file type that isn't listed here, such as a .zip file, view the release page for the version you want. You'll find a complete list of installers for each version.

www.mongodb.com

Realm 사이트에서 설치하자.

👍

 

Object Model 정의하기

 

Quick Start - Swift SDK — Realm

 

www.mongodb.com

 

// Person.swift
import RealmSwift

class Person: Object {
    @Persisted(primaryKey: true) var _id: String
    @Persisted var name: String
    @Persisted var age: Int
}

Realm 데이터 베이스에 저장할 객체 모델 클래스는 Object를 상속한다. 또한 속성에는 @Persisted를 붙여줘야 한다.

PrimaryKey는 고유한 Key값으로 단 하나만 존재 가능하다. 이미 존재하는 Primary Key를 데이터 베이스에 추가하려고 하면 에러가 발생한다.

 

Create

func createPerson() {
	//Realm 가져오기
        let realm = try! Realm()
        
        try! realm.write {
            let newPerson = Person()
            
            newPerson._id = "1"
            newPerson.name = "에코"
            newPerson.age = 26
            
            realm.add(newPerson)
        }
}

 

저장된 위치는 

print(Realm.Configuration.defaultConfiguration.fileURL!)

 

파인더에서 Documents까지 이동해보면

Realm파일이 있다.

 

아까 다운로드한 Realm Studio로 파일을 확인해보면 

데이터가 잘 추가된 게 보인다.

 

Read

func readPerson() {
        //Realm 가져오기
        let realm = try! Realm()
        let people = realm.objects(Person.self)
        let person = realm.object(ofType: Person.self, forPrimaryKey: "1") // Optional
        
        // print(people)
        // print(person)
}

realm.objects로 전체 Person 데이터를 가져올 수 있고, PrimaryKey가 존재한다면 realm.object로 특정 PrimaryKey Data를 가져올 수 있다.

 

object를 이용해 데이터를 가져오면 primaryKey가 없을 수도 있기 때문에 Optional 타입이다.

 

 

Filter Data

추가로 filter를 이용해 특정 데이터만 조회해보자

 

Filter Data - Swift SDK — Realm

String sorting and case-insensitive queries are only supported for character sets in 'Latin Basic', 'Latin Supplement', 'Latin Extended A', and 'Latin Extended B' (UTF-8 range 0-591).

www.mongodb.com

func readPerson() {
        //Realm 가져오기
        let realm = try! Realm()
        let people = realm.objects(Person.self)
        
        let twentySix = people.filter("age == 26") // people중 age가 26인 데이터
        let teemo = people.filter("name CONTAINS[c] '티모'") // //people중 name에 '티모'가 포함된 데이터
        
        print(twentySix)
        print(teemo)
    }

filter 내부에 query문을 넣어서 특정 데이터만 가져올 수 있다.

 

query는 다음번에 더 자세하게 다뤄보도록 하자.

 

Update

func updatePerson() {
        let realm = try! Realm()
        let people = realm.objects(Person.self)
        
        let person = people.filter("name == '티모'").first!
        
        try! realm.write {
            person.name = "올라프"
            person.age += 5
        }
    }

name속성이 티모인 객체 중에 첫 번째 객체의 name과 age속성을 변경해 주었다.

 

만약 Primary Key가 존재한다면

try! realm.write {
    let person = Person(value: ["_id": "1", "name": "오리아나"])
    
    realm.add(person, update: .modified)
}

이런 식으로도 Update가 가능하다. add를 해줬기에 id (Primary Key)에 해당하는 객체가 없다면 그 객체를 추가한다. 

 

Delete

func deletePerson() {
    let realm = try! Realm()
    let person = realm.objects(Person.self).filter("name == '오리아나'")
    try! realm.write {
        realm.delete(person)
        
        //전체 삭제
        //realm.deleteAll()
    }
}

 


여기까지 Realm에서 꼭 필요하다고 생각하는 것들만 정리해보았다. 더 많은 내용은 공식 문서를 참고하자.  Realm 공식문서

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함