💡 swift에서 Realm 사용해보기
✅ Realm Model 만들기
@Persisted
앱을 종료하더라도 유지되어야 하는 데이터를 지정하기 위해 사용
✅ PK 지정하기
@Persisted(primaryKey: true) var id = 0
PK값을 별도로 지정할 수도 있고, 자동으로 key값을 지정하도록 할 수 있다.
💡 CRUD
import RealmSwift
let realm = try! Realm()
realm 파일에 접근하는 상수를 선언한다.
realm 파일의 위치를 찾는 코드
도큐먼트 폴더 내 default.realm
🔎 Create
let realm = try! Realm()
let specificPerson = realm.object(ofType: Person.self, forPrimaryKey: 12345) // pk로 데이터 하나 가져오기
let task = realm.objects(DiaryTable.self) // 저장한 데이터 전부 가져오기
realm studio를 사용하면 테이블 구조를 더 쉽게 볼 수 있다.
🚨 발생할 수 있는 오류
✔️ transaction
하나의 작업의 논리적 단위
데이터를 write를 할 때는 다른 작업을 막아야 한다.
때문에 realm.write()는 try문 내에 작성해야 한다.
✅ Migration
컬럼 명 수정
컬럼 명을 수정하면 데이터의 불일치로 런타임 오류가 발생한다.
컬럼 명 수정 또는 추가처럼 테이블 구조가 바뀌었다면 바뀌었다는 것을 명시해줘야 한다.
테이블 구조가 바뀌었다면 앱을 삭제했다가 설치하면 일단 된다..!
실제 서비스라면 migration 작업이 필요하다.
🔎 Read
데이터 전체 조회하기
let realm = try! Realm()
tasks = realm.objects(DiaryTable.self)
viewWillAppear에서 데이터 변경 감지
realm을 사용한다면 viewDidLoad에서 데이터를 가져오고 viewWillAppear에서 갱신만 해주면 된다!
✔️ Results
Realm의 Results가 가지고 있는 특성때문
데이터가 추가가 되면 자동으로 반영해준다.
때문에 viewDidLoad()에서 데이터를 한 번만 가져온 후 viewWillAppear에서 테이블 뷰 갱신만 해주면 변경된 데이터가 반영된다.
✅ sort
기본 정렬 방식은 데이터가 추가 된 순서이다.
데이터베이스 자체에서 제공하는 sort 기능을 사용하자
정렬 된 상태로 realm에서 가져온다. → 효율
let realm = try! Realm()
// Access all dogs in the realm
let dogs = realm.objects(Dog.self)
// Sort by type-safe keyPath
let dogsSorted = dogs.sorted(byKeyPath: "name", ascending: true) //오름차순
→ 오름차순 정렬
✅ where
string 기반으로 필터링 하기
let result = realm.objects(DiaryTable.self).where {
$0.diaryTitle.contatins("제목", options: .caseInsensitive)
}
.caseInsensitive: 대소문자 상관없이 검색하기 옵션
swift의 고차함수(filter, map)을 사용하게 된다면 데이터를 뷰로 꺼내와서 필터링하는 것이다. 일단은 데이터베이스에서 많은 데이터를 꺼내온 후 필터링을 하기 때문에 효율적이지 못하다.
Realm의 쿼리문을 사용하여 필터링을 하게 되면 데이터를 꺼내오기 전에 필터링을 하는 것이기 때문에 효율이 더 좋다.
🔎 Update
pk로 수정할 레코드에 접근한다.
레코드 수정 후 트랜잭션에 수정 요청을 한다.
.modified로 수정임을 알려준다.
guard let data = data else { return }
let item = DiaryTable(value: ["_id": data._id, "diaryTitle": titleTextField.text!, "diaryContent": contentTextField.text!])
do {
try realm.write {
realm.add(item, update: .modified)
}
} catch {
print("") //nslog
}
해당 방식으로 update시 전체 컬럼 값을 지정하지 않으면 기존 값이 모두 사라지게 된다.
기존 데이터는 유지한 채 원하는 컬럼 값만 수정하고 싶다면?
do {
try realm.write {
realm.create(DiaryTable.self,
value: ["_id": data._id, "diaryTitle": titleTextField.text!, "diaryContent": contentTextField.text!], update: .modified)
}
} catch {
print("")
}
🔎 Delete
'iOS > 🔎 swift 정리하기' 카테고리의 다른 글
[iOS/Swift] MapKit - 원하는 곳에 어노테이션을 찍어보자 (0) | 2023.10.01 |
---|---|
[iOS/Swift] Realm - 백업 및 복구 구현하기 (0) | 2023.09.16 |
[iOS/Swift] Realm - Migration (0) | 2023.09.16 |
[iOS/Swift] Realm - 이미지 파일 저장하기 (0) | 2023.09.16 |
[iOS/Swift] - Swift에서 값을 전달하는 방법 (0) | 2023.09.03 |