이번에 술린더 앱을 기획하면서 데이터베이스를 구축할 일이 생겼습니다. 서버 없이, 오로지 디바이스 내에 구축해야했기 때문에 이것저것 검색을 해보던 중 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)) } } catch{ print("\(error)") } | cs |
RealmStudio로 Realm파일 열기
RealmStudio를 여기에서 다운 받습니다. 실행하신 후, 아래 코드를 실행했을 때 나오는 폴더에 있는 realm파일을 열면, 저장된 데이터를 조회/편집할 수 있습니다.
print(Realm.Configuration.defaultConfiguration.fileURL!)
'Developer > iOS, Swift' 카테고리의 다른 글
[Swift] 갤러리에 저장된 이미지 파일, 서버에 POST하기 (1) | 2020.02.24 |
---|---|
[Swift] 이미지 라이브러리, KingFisher와 AlamofireImage (0) | 2020.02.19 |
[Swift] 캘린더 라이브러리, FSCalendar 사용법 및 예제 (2) | 2020.01.07 |
[Swift] View 둥근 모서리 만들기 (RoundView) (0) | 2019.12.16 |
[Swift] 디바이스에서 FCM 토큰키 불러오기 (0) | 2019.12.16 |
댓글