# [Realm] Things that I realized
Realm을 사용하면서 깨달은 점 끄적끄적. 확실히 사용하기 편하다 하지만 몇가지 조심해야할 점이 있다.
# Position of Instance
try! realm.write() {
// 1
let languages = [English, French, Korean]
for language in languages {
// 2
let realmLanguage = RealmLanguage()
realmLanguage.name = language
realm.add(realmLanguage)
}
}
let realmLanguage = RealmLanguage()
이 부분의 코드를 1번 자리에 두고 계속 사용하였다.
RealmLanguage(name: Korean)
RealmLanguage(name: Korean)
RealmLanguage(name: Korean)
하지만 워와 같이 원하지 않은 이상한 결과만 계속 나왔다. 생각해보면 간단하게 해결할 수 있었던 문제였지만, 고민없는 코딩으로 몇 시간을 허비하였다.
Realm을 이용하요 Array 값 하나 하나를 입력해줄 때는 반드시 2번자리에 넣어주어야 한다. 그렇지 않으면 3개 값을 넣었다면 마지막 변수의 값으로 모두 바뀐다.
# NSPredicate
CoreData를 이용했을 떄와 같이 NSPredicate를 이용해 특정 Object를 추출해서 사용할 수 있다.
NSPredicate(format: "universe == %@", "Star Wars"))
NSPredicate(format: "name < %@", "F"))
NSPredicate(format: "universe IN %@", ["Aliens", "Firefly", "Star Trek"])
NSPredicate(format: "name BEGINSWITH %@", "E"))
NSPredicate(format: "name BEGINSWITH[c] %@", "e"))
NSPredicate(format: "NOT name BEGINSWITH[c] %@", "e"))
# RealmManager
RealmManager를 만들어서 편하게 사용하자. 내가 이용했던 RealmManager는 아래와 같다.
//
// RealmManager.swift
// Multilingual News
//
// Created by Ted on 2021/04/23.
//
import Foundation
import RealmSwift
let realmObject = try! Realm()
class RealmManager: NSObject {
static let shared = RealmManager()
func retrievePredicatedDataForObject(_ T : Object.Type, with criteria: NSPredicate) -> [Object] {
var objects = [Object]()
for result in realmObject.objects(T).filter(criteria) {
objects.append(result)
}
return objects
}
func retrieveAllDataForObject(_ T : Object.Type) -> [Object] {
var objects = [Object]()
for result in realmObject.objects(T) {
objects.append(result)
}
return objects
}
func deleteAllDataForObject(_ T : Object.Type) {
self.delete(self.retrieveAllDataForObject(T))
}
func replaceAllDataForObject(_ T : Object.Type, with objects : [Object]) {
deleteAllDataForObject(T)
add(objects)
}
func add(_ object : Object) {
try! realmObject.write {
realmObject.add(object)
}
}
func add(_ objects : [Object], completion : @escaping() -> Void) {
try! realmObject.write {
realmObject.add(objects)
completion()
}
}
func add(_ objects : [Object]) {
try! realmObject.write {
realmObject.add(objects)
}
}
func update(_ block: @escaping () -> Void) {
try! realmObject.write(block)
}
func delete(_ objects : [Object]) {
try! realmObject.write {
realmObject.delete(objects)
}
}
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
}