일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SWIFTUI
- tuist #xcodecloud #ios #ci/cd #swiftlint #firebase
- UI
- combine
- Firebase
- composablearchitecture
- ios18
- Git
- Alamofire
- 모바일
- TCA
- Navigation
- ObjC
- network
- iOS 13.0+
- iOS 개발자
- xcodecloud
- github
- concurrency
- navigationsplitview
- uikit
- Tuist
- 개발
- xcode
- IOS
- SWIFT
- test
- regex
- swiftdata
- 정규표현식
- Today
- Total
iOS 개발 기록
SwiftUI - Realm 본문
Realm은 모바일 환경을 주요 타킷으로 하는 오픈소스 데이터베이스 관리 시스템이다. 모델 구조가 객체 컨테이너로 된 NoSQL 데이터베이스를 지향하며 조금 더 직관적인 사용이 가능하고 데이터 처리 속도가 향상된 장점이 있다. 찾아보니 SwiftUI와 Combine에도 적극적으로 지원하는데 정리된 자료가 많이 없는것 같아 개인적으로 공부하며 정리해본다.
Realm 의 장점
1. Swift 뿐만 아니라 JAVA, Objective-C, JavaScript, React Native 등을 지원해 크로스 플랫폼으로 DB를 공유할 수 있다.
2. SQLite, FMDB, CoreDate 등 보다 빠르다.
3. Real-Time data base sync가 가능해 Realm Studio 으로 실시간으로 데이터를 확인할 수 있고, 서버 - 모바일간 실시간 동기화가 가능하다.
4. 공식 홈페이지를 따르면 개발자에게 직관적이라고 한다.
사용법
모델의 정의
모델의 정의는 일반적인 Swift Class를 정의하는것과 같이 하면 된다. 다른점이라면 Object를 상속받아야 하고, 프로퍼티 앞에 @Persisted를 붙여줘야 한다. 해당 모델에서는 이름을 Primary Key로 사용한다.
class Beer: Object {
@Persisted(PrimaryKey: true) var name: String
@Persisted var brewery: String
@Persisted var isFavorite: Bool
convenience init(id: String, name: String, isFavorite: Bool) {
self.init()
self.id = id
self.name = name
self.isFavorite = isFavorite
}
}
CRUD
Realm 데이터베이스를 사용하기 위해서는 Local에 있는 Realm 객체를 정의하고 사용해야한다.
저장되는 데이터의 경로는 Realm.Configuration.defaultConfiguration.fileURL! 를 통해서 확인할 수 있다.
Create
// Realm에 데이터를 추가하는 함수
func addBeer() {
//log 출력
print(#fileID, #function, #line, "경로: \(Realm.Configuration.defaultConfiguration.fileURL!)")
// realm DB에 접근하기 위해서는 먼저 Realm()을 통해 객체를 만들어 접근해야한다.
let realm = try! Realm()
// 추가할 데이터 설정
let favoriteBeer = Beer(name: "Westvleteren XII", brewery: "BEEREAU", isFavorite: true)
// realm에 추가
try! realm.write{
realm.add(favoriteBeer)
}
}
Read
// 조회
func readBeers() {
let realm = try! Realm()
// 모든 객체
let beers = realm.objects(Beer.self)
// 조건을 가지고 필터링
let favoriteBeers = realm.objects(Beer.self).filter{ $0.isFavorite == true }
// PrimaryKey로 검색
let favoriteBeer = realm.object(ofType: Beer.self, forPrimaryKey: "Westvleteren XII")
}
Update
// 수정
func toggleFavorite(beer: Beer) {
let realm = try! Realm()
// 업데이트할 데이터 조회
let updatBeer = realm.object(ofType: FavoriteCharacters.self, forPrimaryKey: "Life")!
try! realm.write{
updateBeer.isFavorite = true
}
}
Delete
// 삭제
func deleteBeer() {
let realm = try! Realm()
let deleteBeer = realm.object(ofType: Beer.self, forPrimaryKey: "TERRA")
try! realm.write{
realm.delete(removeChar!)
}
}
MVVM
SwiftUI에서는 데이터들이 변경될 때에 이를 감지할 수 있도록 @State, @EnvironmentObject와 같은 Property wrappers를 제공한다. Realm에서도 DB의 내용이 변경됐을 때에 자동으로 업데이트 해주는 기능을 제공한다. 공부하면서 써본 것들만 일단 정리해보고 다른 것들도 써볼 때 마다 업데이트 해야겠다.
@ObservedRealmObject
구독한 Realm Object나 List가 변경될 때 마다 이를 뷰에 반영할 수 있도록 제공되는 Property wrappers. @ObservedResults을 통해 관찰한다. 해당 데이터는 ObjectKeyIdentifiable Protocol을 준수해야만 한다.
@ObservedResults
이는 Environment Value인 realmConfiguration을 따르므로 RealmDB 데이터에 변화가 있을 때에 이를 관찰할 수 있다. 변화가 관찰되었을 때에 realm의 쿼리 결과를 따라 화면을 다시 그려준다.
// Beer에 ObjectKeyIdentifiable 프로토콜 추가
Extension Beer: ObjectKeyIdentifiable {}
// ViewModel의 Data를 관리하는 곳에서
@ObservedRealmObject var beers: Beer
// View를 그리는 곳.
@ObservedResults(Beer.self) var favoriteBeer
var FavoriteBeers: some View {
return List(favoriteBeer) { beer in
VStack {
if beer.isFavorite == true {
Text("내가 좋아하는 \(beer.name)!! ")
}
}
}
}
레퍼런스 링크
https://www.mongodb.com/docs/realm/sdk/swift/swiftui/#std-label-ios-swiftui-quick-start
https://www.mongodb.com/docs/realm-sdks/swift/latest/index.html
'SwiftUI' 카테고리의 다른 글
[iOS] WidgetKit (0) | 2023.02.06 |
---|---|
[iOS] swiftUI에서 UIKit 사용하기 (0) | 2023.02.06 |
SwiftUI - View의 크기를 구하는 방법 (0) | 2022.07.07 |
SwiftUI - 애니메이션 (0) | 2022.04.21 |
SwiftUI의 4가지 원칙 (0) | 2022.04.13 |