Core Data
•
Core Data는 데이터베이스가 아님 → 데이터베이스의 역할을 하는 Persistence(SQLite)가 Core Data 기능 중 하나 일 뿐..
•
Core Data는 넓은 의미로 앱의 모델 계층이며, 객체 그래프를 관리하는 Framework입니다.
Core Data Stack → Core Data의 핵심, 앱의 모델 layer를 관리하고 유지하는 역할
NSManagedObjectModel
이 친구는 Entity를 설명하는 Database 스키마라고 보시면 됩니다. managed objects의 structure를 정의해요
NSPersistentStoreCoordinator
이 친구는 persistent storage(영구 저장소)와 managed object model을 연결합니다.
NSManagedObjectContext
이 친구는 transaction이라고 보시면 됩니다. managed objects를 생성하고, 저장하고, 가져오는(fetch) 작업같은 걸 제공해요.
NSPersistentContainer
◦
Core Data Stack을 나타내는 필요한 모든 객체를 포함합니다.
SQLite3
Realm
•
listModel
// Object : must be Optional
class ListModel: Object {
@objc dynamic var reminderTitle: String = ""
@objc dynamic var reminderColor: String = ""
@objc dynamic var num: Int = 0
}
Swift
복사
•
Realm 모델 속성들은 기본 데이터베이스 데이터에 접근되기 위해 접근 순서로 dynamic var 특성이 필요
•
dynamic 속성들의 동적 디스패치에 사용되는 Objective‑C 런타임에 표시할 수 없기 때문에 List와 RealmOptional 속성들을 동적으로 정의할 수 없습니다.
•
항상 let을 사용하여 선언해야 합니다.
•
ReminderModel
class ReminderModel: Object {
@objc dynamic var reminderTtile: String = ""
@objc dynamic var reminderColor: String = ""
@objc dynamic var title: String = ""
@objc dynamic var memo: String = ""
@objc dynamic var date: String = ""
@objc dynamic var time: String = ""
@objc dynamic var repeatReminder: String = ""
@objc dynamic var location: String = ""
@objc dynamic var priority: String = ""
@objc dynamic var done: Bool = false
}
Swift
복사
•
준비
var realm : Realm?
var Lists: Results<ListModel>?
override viewDidLoad() {
super.viewDidLoad()
realm = try? Realm()
Lists = realm?.objects(ListModel.self)
}
Swift
복사
Zero-Copy Design
•
접근자 메서드를 호출 → 데이터베이스에서 read/write 할 수 있는 프록시 객체(쿼리 결과) 반환
◦
프록시 객체(쿼리 결과)는 데이터를 바라보고 있기 때문에 DB의 모든 변경 내용은 동일한 데이터를 가리키는 모든 객체에 반영 → 새로운 프록시 객체 가져올 필요 없음
// Get the default Realm
let realmInstance = try! Realm()
// You only need to do this once (per thread)
// thread 하나당 1 Realm()
Swift
복사
RealmSwift
→ Realm과 RealmSwift의 차이가 있는지는 모르겠다. RealmSwift가 Swift에서 사용하는 Realm인거 같다. Model만드는 데 사용되는 Object가 Realm만 사용하면 적용이 안된다.
⇒ 맞는 거 같음. Kotlin도 Kotlin만의 Kotlin Realm이 있는 듯
⇒ Realm도 Swift만의 Realm인 RealmSwift를 사용해야 하는 듯
id
try! realm.write {
realm.create(Book)
// update를 쓰게 되면 동일한 id값이 들어오면 update시켜줌
// 하지만 id값이 없을 시에는 사용불가
realm.add(Book, update: true)
}
Swift
복사
•
기본키를 정의하지 않은 객체 타입에는 update: true를 전달할 수 없습니다
Key-Value Coding(KVC)
•
•
컬렉션에 KVC를 적용하는 것은 모든 아이텐에 대한 접근을 작성하는 동안 컬렉션을 통해 반복하는 오버 헤드 없이 대량으로 객체를 업데이트 할 수 있는 좋은 방법입니다.
let persons = realm.objects(Person.self)
try! realm.write {
persons.first?.setValue(true, forKeyPath: "isFirst")
// set each person's planet property to "Earth"
persons.setValue("Earth", forKeyPath: "planet")
}
Swift
복사
FileURL
print(Realm.Configuration.defaultConfiguration.fileURL)
Swift
복사