본문 바로가기
DataBase/IOS - Realm

IOS) Realm - CRUD Operation & Notification - 2

by 후르륵짭짭 2021. 12. 4.
728x90
반응형

 

 

아직 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/

 

NSPredicate Cheatsheet

Oops something went wrong You will not be receiving an email shortly with details on your subscription

academy.realm.io

저도 끝까지 봐야하는데, 그냥 기본적인 것만 확인 했습니다.

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)")
    }
728x90
반응형

댓글