apple/iOS

[Realm] Realm CRUD more modern and swifty

lgvv 2022. 9. 4. 17:05

Realm CRUD more modern and swifty

 

Realm 설치 - SPM으로 고고

https://github.com/realm/realm-swift

 

GitHub - realm/realm-swift: Realm is a mobile database: a replacement for Core Data & SQLite

Realm is a mobile database: a replacement for Core Data & SQLite - GitHub - realm/realm-swift: Realm is a mobile database: a replacement for Core Data & SQLite

github.com

 

 

Realm CRUD 살펴보기

import Foundation
import RealmSwift

class Note: Object {
    private static let realm = try! Realm()
    
    /// 고유 id
    @Persisted(primaryKey: true) var id: String = UUID().uuidString
    
    /// 기록하는 시간
    @Persisted var date: Date = Date()
    /// 노트의 아이디
    @Persisted var title: String
    /// 노트의 내용
    @Persisted var content: String
    
}

extension Note {
    /// 랜덤한 노트를 생성
    static func createNote(action : (() -> Void)? = nil) {
        let title = String.createRandomString(length: 5)
        let content = String.createRandomString(length: 30)
        
        let note = Note()
        note.title = title
        note.content = content
        
        // ✅ 1. create의 경우에는 add로 처리
        try! realm.write { 
            realm.add(note)
        }
        
        action?()
    }
    
    /// 노트에 해당하는 정보를 읽음
    static func readNote() -> Results<Note> {
         return realm.objects(Note.self)
    }
    
    /// 해당 노트를 업데이트
    static func updateNote(with note: Note, indexPath: IndexPath) async throws -> Void {
        let note = note
        
        // NOTE: - Realm은 이렇게해서 업데이트가 가능하다.
        try! realm.write {
            // ✅ 1. 걍 write를 통해 해당 note객체를 업데이트 하면 된다.
            // 특히 다른 포스팅 글에서 first 등을 사용하던데 안그래도 된다.
            note.content = String.createRandomString(length: 30)
            
            return
        }
    }
    
    /// 해당 노트를 삭제
    static func deleteNote(with note: Note, action : (() -> Void)? = nil) {
        // ✅ 1. 해당 객체 삭제하면 된다.
        try! realm.write {
            realm.delete(note)
        }
        
        action?()
    }
}

 

Realm의 경우에는 sync가 상당히 중요하다. 따라서 가장 기본적으로는 write를 사용하며 이 내부의 코드가 실행되는 동안 다른 write 작업이 수행되지 않게 block 된다.

 

String+

//
//  String.swift
//  AppleCollectionView
//
//  Created by Hamlit Jason on 2022/09/01.
//

import Foundation

extension String {
    static func createRandomString(length: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        return String(
            (0..<length)
                .map { _ in letters.randomElement()! }
        )
    }
}

String 랜덤으로 만들기

 

 

아래 글은 Query에 대한 부분이다.

우선 다른 포스팅에서 Query를 사용할때 NSPredicate를 많이 사용하는데, Swifty하게 작성해보자.

 

https://www.mongodb.com/developer/products/realm/realm-swift-query-api/

 

Goodbye NSPredicate, hello Realm Swift Query API | MongoDB

New Realm Swift Query API supersedes NSPredicate with type-safe queries

www.mongodb.com

/// 제목을 기준으로 필터링 한 노트를 반환
    static func readNote(with text: String) async throws -> Results<Note> {
        let object = realm.objects(Note.self)
            .where { note in
                note.title.contains(text)
            }
        return object
    }

그냥 이렇게 작성했다.

 

근데 궁금증이 하나 생겼는데, 이렇게 작성하면 SQL을 완전히 대체가 가능할 수 있을지 고민이기도 하다.

엄청 Swifty해서 깔끔하다!