Realm CRUD more modern and swifty
Realm 설치 - SPM으로 고고
https://github.com/realm/realm-swift
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/
/// 제목을 기준으로 필터링 한 노트를 반환
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해서 깔끔하다!
'apple > iOS' 카테고리의 다른 글
[Realm] Realm migration (Swift) (0) | 2022.09.05 |
---|---|
[Realm] The document “default.realm” could not be opened. (0) | 2022.09.05 |
[iOS] UICollectionView에 대해서 알아보기 7편 (UICollectionViewDiffableDataSource) (1) | 2022.09.04 |
[iOS] UICollectionView에 대해서 알아보기 6편 (Realm, async, await, Delegate) (1) | 2022.09.04 |
[iOS] 내가 보려고 기록하는 Realm 구조 설계하기 및 @escaping (0) | 2022.09.02 |