아직 Realm의 기능을 다 정리하지 못 했습니다 ㅎㅎㅎ
이거 작성 하고 Migration이랑 Configulation 좀 보려고 합니다.
이번 글에는 Realm의 CRUD의 연장선인데, Realm의 강한 기능을 보여주려 합니다.
** 잡소리 **
요즘 목이 너무 안 좋아진 것 같아요 ㅠㅠ
그런데 공부 할 건 많네요 ㅎㅎㅎ
SwiftUI , Alamofire,,,, CI/CD도 알야하고,,,
** Realm의 Powerful한 기능 **
- 언제나 최신의 데이터 -
이건 정말 파워풀 합니다!
func liveResultFetch(){
//Fetch를 하지 않고도 데이터를 추가할 수 있다.
let realm = try! Realm()
let users = realm.objects(User.self)
print("User Before Insert :\(users.count)")
let newuser = createRealmObject(name: "danish", id: 2)
try! realm.write({
realm.add(newuser)
})
print("User After Insert without explicitly fetched \(users.count)")
}
Realm은 데이터를 다시 가져올 필요 없이 항상 최신의 값을 제공합니다.
MySQL이나 CoreData는 모두 최신의 값을 제공하기 위해서 데이터를 읽어야 하지만
Realm은 그럴 필요가 없습니다.
- Predicate를 제공 -
SQLite , MySQL은 데이터를 필터하고 가져 올 때 SQL문이 있습니다.
이건 외우면 터미널 처럼 커맨드만 작성하면 쉽게 가져 올 수 있습니다.
그런데 Realm도 Predicate로 SQL문 비슷한 것을 제공 합니다.
https://academy.realm.io/posts/nspredicate-cheatsheet/
저도 끝까지 봐야하는데, 그냥 기본적인 것만 확인 했습니다.
func samplePredicate(){
let realm = try! Realm()
let usrsWithExactMatch = realm.objects(User.self).filter("firstName == 'ali'")
print("userWithExactMatch \(usrsWithExactMatch.count)")
//그냥하면 대소문자 구분 못 함
let usersWithCaplitalLetterWithCaseSensitive = realm.objects(User.self).filter("firstName == 'AlI'")
print("usersWithCaplitalLetterWithCaseSensitive : \(usersWithCaplitalLetterWithCaseSensitive.count)")
//대소문자 구별없이 하려면 [c]를 넣어줘야한다.
let usersWithCapitalLetterWithNoCaseSensitive = realm.objects(User.self).filter("firstName == [c] 'AlI'")
print("usersWithCapitalLetterWithNoCaseSensitive : \(usersWithCapitalLetterWithNoCaseSensitive.count)")
// IN 구문은 변수 IN {아이템들} -> 변수로 아이템을 찾을때 사용한다.
let usersWithInPredicate = realm.objects(User.self).filter("userId IN {1,2,3,4}")
print("usersWithInPredicate : \(usersWithInPredicate.count)")
//문자열로 되어 있는 변수에서 'A'로 시작하는 것만 필터링
let usersWithBeginPredicate = realm.objects(User.self).filter("firstName BEGINSWITH 'a'")
print("usersWithBeginPredicate : \(usersWithBeginPredicate.count)")
//대소문자 관계없이 FirstName이 LI를 포함하는 것만 필터링
let usersWithCONTAINSPredicate = realm.objects(User.self).filter("firstName CONTAINS [c] 'LI'")
print("usersWithCONTAINSPredicate : \(usersWithCONTAINSPredicate.count)")
//Predicate With Linked Object
let usersPredicatedWithPassort = realm.objects(User.self).filter("passport.passportNumber == 'pass1'")
print("usersPredicatedWithPassort : \(usersPredicatedWithPassort.count)")
//Using Todos
//투두 프로퍼티는 배열이기 때문에 필터링 할 때 ANY를 붙여서 필터링 해준다.
let userPredicatedWithTodos = realm.objects(User.self).filter("ANY todos.details == 'Need to create RxSwift blog'")
print("userPredicatedWithTodos : \(userPredicatedWithTodos.count)")
}
- 쉽게 PrimaryKey 값들을 바꿀 수 있다! -
PrimaryKey 자체를 변경하는건 안됩니다!!
그러나 PrimaryKey를 찾아서 변경해줄 필요 없이
그냥 동일한 PrimaryKey라면 쉽게 바꿀 수 있습니다.
func updateObjectWithSamePRIKey(){
let realm = try! Realm()
let user = realm.object(ofType: User.self, forPrimaryKey: 1)!
let newUser = createRealmObject(name: "change name", id: 1)
newUser.passport = user.passport
newUser.todos.append(objectsIn: user.todos)
try! realm.write({
realm.add([newUser], update: .modified) //해당 키 값이 같은 녀석이라면 변경해준다.
})
print(user.firstName)
}
- 정렬 기능 제공 -
Realm에는 Key값으로 정렬하는 기능을 제공합니다.
func sortWithKeyPath(){
let realm = try! Realm()
let usrsWithExactMatch = realm.objects(User.self)
.filter("firstName == 'ali'")
.sorted(byKeyPath: "firstName")
print("userWithExactMatch \(usrsWithExactMatch.first)")
}
'DataBase > IOS - Realm' 카테고리의 다른 글
IOS)Realm - Migration (0) | 2022.05.23 |
---|---|
IOS)Realm - Multi Threading (0) | 2022.04.28 |
IOS)Realm - Configuration & Extension Realm Share - 1 (0) | 2022.02.13 |
IOS) Realm - CRUD Operation & Notification - 3 (2) | 2021.12.12 |
IOS) Realm - CRUD Operation & Notification - 1 (0) | 2021.12.04 |
댓글