본문 바로가기

Ios/DataBase

IOS - 간단한 Swift Realm 라이브러리 사용법

Realm은 작업 속도가 빠른 모바일용 데이터베이스 라이브러리이며 오픈소스입니다.

 

설치방법
1. Cocoapods를 이용해 설치합니다
2. 터미널을 열고 realm을 이용할 프로젝트 디랙토리로 이동합니다.
Tip("$ls" : 현재 디렉토리에 모든 폴더와 파일을 보여줌, "$cd 폴더명" : 해당 폴더로 이동)
3. "$pod init" 로 pod 초기화

4. "$ls"를 입력하면 Podfile이란 이름의 파일이 보입니다. "$vim Podfile" vim으로 해당 파일을 엽니다.
5. 텍스트를 보면 가운데 쯤 "# Pods for 프로젝트명" 부분이 보일텐데 바로 아래에 pod 'RealmSwift'라고 입력하고 저장합니다.
Tip(vim 명령어 i 입력모드, esc 누르면 다시 탐색모드, :qw 저장 및 나가기.)
6. "$pod install"을 입력하면 라이브러리를 설치합니다. 다른 라이브러리들도 위와 같은 방법으로 추가 하면 됩니다.

참고로 특정 라이브러리를 삭제하고 싶다면 Podfile에서 입력한 pod "라이브러리 이름" 부분을 지워준뒤 다시 "pod install"을 하면 알아서 remove 해줍니다.

 

사용법
1. 프로젝트명.xcodeproj이 아닌 프로젝트명.xcworkspace 파일을 열어서 작업해야합니다.
2. import RealmSwift를 입력하여 realm 라이브러리를 불러옵니다.

 

데이터베이스 모델 생성

import RealmSwift

class Player : Object {
    @objc dynamic var name: String = ""
    @objc dynamic var position: String = ""
    @objc dynamic var age: Int = Int()
}

위와 같이 class를 작성하듯이 데이터베이스 모델을 만들면 되는데 매우 익숙하고 직관적인 방법입니다. 이 때 클래스는 realm 데이터베이스 모델 클래스를 만드는데 사용되는 Object 클래스를 상속합니다.

 

 

프로퍼티를 생성할 때 @objc와 dynamic 키워드를 붙여줍니다. dynamic 키워드를 붙이는 이유는 Runtime 일때, Realm이 자동으로 변수의 변화를 탐지하기 위해서이고 이러한 과정이 objective-c를 통해 이루어지기 때문에 @objc 키워드를 덧붙입니다.

 

이제 Realm을 이용한 CRUD 구현에 대해 알아보겠습니다.

 

Create

생성한 데이터베이스 모델을 통해 아래와 같이 모델 객체를 생성하여 데이터베이스에 추가할 수 있습니다.

let realm = try! Realm() // default realm을 만든다.

var name = "park"
var position = "CD"
var age = 20

let park = Player() // 만들어둔 데이터베이스 모델인 Player모델(클래스)의 객체를 생성한다.

park.name = name // 클래스의 속성을 다루듯이 값을 입력해준다.
park.position = position
park.age = 20

do{
    try realm.write{ // realm.write{}는 git에서 commit을 해주는 것과 비슷하다.
        realm.add(park) // 데이터베이스에 park 모델을 더한다.
    }
} catch {
	print("Error Add \(error)")
}

 

 

Read

realm 데이터베이스를 불러올때 반환값은 Results<>타입의 값으로 반환됩니다. 따라서 읽어온 데이터를 받을 변수의 타입을 Results<>로 지정해야 합니다.

var player: Results<Player>	// realm 데이터베이스를 불러올때는 반환타입이 Results<>타입이다.

player = realm.objects(Player.self)	// realm.objects(모델클래스명.self)

 

 

Update

realm 데이터베이스에 등록된 데이터들의 변경은 realm.write 안에서만 이루어져야 합니다.

do{
    try realm.write{
        park.position = "CF"
    }
} catch {
	print("Error Update \(error)")
}

 

Delete

모델의 삭제 또한 간단합니다.

do{
    try realm.write{
        realm.delete(park)
    }
} catch {
	print("Error Delete \(error)")
}

 

Query & Sorting

query는  Results<>타입의 인스턴스의 filter 메소드를 통해서 가능합니다.

 

쿼리는 filter("[프로퍼티이름] CONTANINS[cd] %@", [%@에 넣을 값])의 형태이며 [cd]는 대소문자(capital), 발음구별부호(diacritic)에 무관하게 %@의 값이 포함된 프로퍼티 이름을 가진 모든 모델들을 쿼리합니다.

 

소팅은 sorted(byKeyPath: [소팅의 기준이되는 프로퍼티명], ascending: [Bool])의 형태이며 ascending이 true이면 오름차순, false이면 내림차순을 나타냅니다.

playerList = playerList?.filter("name CONTAINS[cd] %@", "park").sorted(byKeyPath: "name", ascending: true)

쿼리를 위한 formatted strings 예시

 

 

 

 

확인
1. 이렇게 추가한 모델이 실제로 데이터베이스에 잘 입력되었는지 확인하기 위해 우선 Realm에서 제공하는 Realm Studio를 설치합니다. 

2. 아래의 함수를 viewDidLoad() 함수의 안에 호출하여 앱의 Document 폴더의 주소를 찾아냅니다. 앱을 실행하면 xcode 콘솔창에 주소가 나오는데 해당 주소를 복사하여 파인더에 검색합니다.(시간이 조금 걸림)
3. default.realm 파일을 Realm Studio로 실행하면 모델이 데이터베이스에 추가된 것을 확인 할 수 있습니다.

    func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = paths[0]
        return documentsDirectory
    }