본문 바로가기
Developer/iOS, Swift

[Swift] Realm 기본 사용 방법 및 예제

by Doony 2020. 1. 9.

이번에 술린더 앱을 기획하면서 데이터베이스를 구축할 일이 생겼습니다. 서버 없이, 오로지 디바이스 내에 구축해야했기 때문에 이것저것 검색을 해보던 중 Realm을 발견했습니다. 구글에 그냥 Realm을 검색해서 사이트를 찾아보니, 과거 버전이 많이 뜨더라고요. 최신버전은 늘 공홈에서 확인하는 습관을 길러야겠습니다. 공식 깃허브에서는 아래와 같이 설명하고 있습니다.


Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository holds the source code for the iOS, macOS, tvOS & watchOS versions of Realm Swift & Realm Objective-C.


iOS뿐만 아니라 다른 프레임워크들에서도 이용이 가능합니다. 다음에 안드로이드 버전으로도 한번 테스트해봐야겠습니다.
아무튼, 오늘은 술린더앱에서 달력에 날짜를 선택하면, 해당날짜의 연/월/일을 각각 데이터로 저장해보도록 하겠습니다.

Realm 설치하기

CocoaPod를 이용해 다음 순서로 진행합니다.
먼저 podfile에 아래 사항을 추가합니다.
pod 'RealmSwift'
터미널에서 프로젝트 경로로 이동한 후, 설치합니다.
pod install


Realm에 저장할 데이터 타입 클래스 생성

스위프트 파일을 하나 만들어 데이터 타입을 정의합니다. 저는 연/월/일에 해당하는 year/month/day를 만들어줬습니다.

1
2
3
4
5
6
7
8
import RealmSwift
 
class DateRealm: Object {
    @objc dynamic var year = ""
    @objc dynamic var month = ""
    @objc dynamic var day = ""
}
 
cs

저장해볼까요?

메인뷰컨트롤러에 원하는 형식에 따라 아래 코드 추가 저의 예제는 FSCalendar 이라는 캘린더 라이브러리에서, 특정 날짜 클릭 시 바로 저장되게 하고 싶었는데요. 캘린더에서 year, month, day를 각각 가져와서 Realm에 저장했습니다. FSCalendar에 대한 포스팅은 여기에서 확인하실 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
// 데이터 타입 클래스를 선언하고, 저장할 year/month/day를 각각 지정합니다.          
let dateSelected = DateRealm()      
dateSelected.year = year
dateSelected.month = month
dateSelected.day = day
            
// Realm 가져오기
let realm = try! Realm()
 
// Realm 에 저장하기
try! realm.write {
    realm.add(dateSelected)
}
cs

불러와볼까요?

데이터가 잘 저장되었는지, 전체 데이터를 한번 출력해보겠습니다.


1
2
3
4
let realm = try! Realm()
let savedDates = realm.objects(DateRealm.self)
print(savedDates) // => 0 because no dogs have been added to the Realm yet
 
cs

Realm을 가져오고, 데이터타입 클래스로 읽게 되면, 해당 데이터타입 클래스로 저장된 데이터가 모두 불러와집니다. print된 결과는 다음과 같습니다.


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
Results<DateRealm> <0xdd> (
    [0] DateRealm {
        year = 2020;
        month = 01;
        day = 02;
    },
    [1] DateRealm {
        year = 2020;
        month = 01;
        day = 01;
    },
    [2] DateRealm {
        year = 2020;
        month = 01;
        day = 03;
    },
    [3] DateRealm {
        year = 2020;
        month = 01;
        day = 04;
    },
    [4] DateRealm {
        year = 2020;
        month = 01;
        day = 07;
    }
)
cs

제가 캘린더로 눌렀던 날짜들이 각각 저장되어 있네요. 여기서 특정 항목만 추출하는 방법은 다음과 같습니다.


  • sorted: 정렬
  • filter: 필터
    자세한 사항은 공식 홈페이지에 친절히 설명되어있습니다. 필터링은 두가지 방식이 있는데, 저는 아래 코드에 사용된 것처럼 predicate string으로 하는 것이 더 직관적으로 느껴지네요.

1
2
3
4
5
6
let realm = try! Realm()
let savedDates = realm.objects(DateRealm.self)
// day 기준으로 sorting
print(savedDates.sorted(byKeyPath: "day", ascending: true))
// day가 07인 경우만 
print(savedDates.filter("day == '07'"))
cs

데이터 삭제하기

데이터를 삭제하는 방법은 add하는 방법과 유사합니다. 각 필드별 데이터가 담긴 데이터타입 클래스를 만들고, 이를 아래와 같이 코드로 만들어주면 됩니다. 이번에는 NSPredicate를 사용해봤는데요. 연/월/일로 필터링하기 위해 사용했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
let realm = try! Realm()
let dateSelected = DateRealm()
dateSelected.year = year
dateSelected.month = month
dateSelected.day = day
        
//삭제하는 방법
do{
    try realm.write{
        let predicate = NSPredicate(format: "year = %@ AND month = %@ AND day = %@", year, month, day)
        realm.delete(realm.objects(DateRealm.self).filter(predicate))
    }           
catchprint("\(error)") }
cs

RealmStudio로 Realm파일 열기

RealmStudio를 여기에서 다운 받습니다. 실행하신 후, 아래 코드를 실행했을 때 나오는 폴더에 있는 realm파일을 열면, 저장된 데이터를 조회/편집할 수 있습니다.


print(Realm.Configuration.defaultConfiguration.fileURL!)


댓글