Search

[정리] iOS 자체 데이터베이스 구축 3인방 간단 설명

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

RealmRealmSwift의 차이가 있는지는 모르겠다. RealmSwift가 Swift에서 사용하는 Realm인거 같다. Model만드는 데 사용되는 ObjectRealm만 사용하면 적용이 안된다.
⇒ 맞는 거 같음. 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)

ObjectResultList 모두 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
복사