Realm은 SPM을 지원합니다.
따라서 SPM으로 추가해주시면 보다 쉽게 사용하실 수 있습니다.
import RealmSwift
으로 RealmSwift가 에러나지 않고 추가되면 성공.
Realm에 저장할 Object를 하나 만들어 봅시다.
import RealmSwift
class SomeModelObject: Object {
@Persisted(primaryKey: true) var id: String
@Persisted var title: String
@Persisted var desc: String
@Persisted var isDone: Bool
@Persisted var date: Date
@Persisted var optionType: List<Int>
@Persisted var rootId: String
convenience init(title: String) {
self.init()
self.id = UUID().uuidString
self.title = title
self.desc = ""
self.isDone = false
self.date = Date()
self.optionType = List<Int>()
self.rootId = ""
}
}
Realm은 Object자체를 하나의 테이블 처럼 보기때문에 한번 생성하면 키값을 추가할때 꼭 마이그레이션 작업을 해줘야합니다.
마이그레이션 없이 키를 추가했다면 앱 크래시의 원인이 될 수 있습니다. ( 다음편에서 다룰예정 )
id 값을 저는 String으로 선언해서 uuid를 썼는데 기본으로 제공하는 ObjectId 타입을 사용하셔도 됩니다.
모델은 모델을 품을 수 있습니다.
import RealmSwift
class RootModelObject: Object {
@Persisted(primaryKey: true) var key: String
@Persisted var tasks = List<SomeModelObject>()
convenience init(key: String, tasks: [SomeModelObject]) {
self.init()
self.key = key
self.tasks.append(objectsIn: tasks)
}
}
Realm은 [] 타입이 아닌 List<>을 지원하고 있습니다.
값을 가지고 오고 싶을때는
func getRootModelObject(forKey key: String) -> RootModelObject? {
do {
let realm = try Realm()
return realm.object(ofType: RootModelObject.self, forPrimaryKey: key)
}catch {
print("Error: \(error)")
return nil
}
}
realm을 선언해서 해당하는Object를 Key로 찾아오면되고
func getObjects() -> Results<RootModelObject>? {
do {
let realm = try Realm()
return realm.objects(RootModelObject.self)
}catch {
print("Error: \(error)")
return nil
}
}
이렇게 Object자체가 있는지 확인해볼 수 있습니다.
아래는 읽고 쓰고 지우고의 예제 코드입니다.
import Foundation
import RealmSwift
class RealmManager {
static let shared = RealmManager()
func getRootModelObject(forKey key: String) -> RootModelObject? {
do {
let realm = try Realm()
return realm.object(ofType: RootModelObject.self, forPrimaryKey: key)
} catch {
print("Error: \(error)")
return nil
}
}
func getObjects() -> Results<RootModelObject>? {
do {
let realm = try Realm()
return realm.objects(RootModelObject.self)
} catch {
print("Error: \(error)")
return nil
}
}
func isKeyAlreadyExists(key: String) -> Bool {
return getRootModelObject(forKey: key) != nil
}
func writeRootModelObject(forKey key: String, tasks: [SomeModelObject]) {
do {
let realm = try Realm()
if let existingObject = getRootModelObject(forKey: key) {
try realm.write {
for task in tasks {
existingObject.tasks.append(task)
}
}
} else {
let rootObject = RootModelObject(key: key, tasks: tasks)
try realm.write {
realm.add(rootObject)
}
}
} catch {
print("Error: \(error)")
}
}
func deleteSomeModelObjectFromRootModel(rootKeyId: String, someModelId: String) {
do {
let realm = try Realm() // Realm 객체 생성
if let rootObject = getRootModelObject(forKey: rootKeyId) {
if let index = rootObject.tasks.firstIndex(where: { $0.id == someModelId }) {
try realm.write {
rootObject.tasks.remove(at: index)
}
}
}
} catch {
print("Error: \(error)")
}
}
}
자주쓰는 처리들은 RealmManager을 만들어서 처리하면 더 쉽게 수정할 수 있습니다.
해당 코드는 https://github.com/Kim-Jiny/RealmSample 에서 확인하실 수 있습니다.