[iOS/Swift] Realm - CRUD

2023. 9. 16. 23:19·iOS/UIKit&SwiftUI

 

💡 swift에서 Realm 사용해보기

✅ Realm Model 만들기

Untitled.png

 

@Persisted

앱을 종료하더라도 유지되어야 하는 데이터를 지정하기 위해 사용

✅ PK 지정하기

Untitled.png

@Persisted(primaryKey: true) var id = 0

 

 

PK값을 별도로 지정할 수도 있고, 자동으로 key값을 지정하도록 할 수 있다.

Untitled.pngUntitled.png

💡 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) // 저장한 데이터 전부 가져오기

Untitled.pngUntitled.png

 

 

 

Untitled.png

realm studio를 사용하면 테이블 구조를 더 쉽게 볼 수 있다.

🚨 발생할 수 있는 오류

Untitled.png

✔️ transaction

하나의 작업의 논리적 단위

데이터를 write를 할 때는 다른 작업을 막아야 한다.

때문에 realm.write()는 try문 내에 작성해야 한다.

✅ Migration

컬럼 명 수정

Untitled.png

컬럼 명을 수정하면 데이터의 불일치로 런타임 오류가 발생한다.

컬럼 명 수정 또는 추가처럼 테이블 구조가 바뀌었다면 바뀌었다는 것을 명시해줘야 한다.

테이블 구조가 바뀌었다면 앱을 삭제했다가 설치하면 일단 된다..!

실제 서비스라면 migration 작업이 필요하다.

🔎 Read

데이터 전체 조회하기

let realm = try! Realm() 
tasks = realm.objects(DiaryTable.self)

viewWillAppear에서 데이터 변경 감지

Untitled.png

 

realm을 사용한다면 viewDidLoad에서 데이터를 가져오고 viewWillAppear에서 갱신만 해주면 된다!

Untitled.png

✔️ Results

Realm의 Results가 가지고 있는 특성때문

Untitled.png

데이터가 추가가 되면 자동으로 반영해준다.

때문에 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) //오름차순

Untitled.png

→ 오름차순 정렬

✅ where

string 기반으로 필터링 하기

let result = realm.objects(DiaryTable.self).where {
	$0.diaryTitle.contatins("제목", options: .caseInsensitive)
}

.caseInsensitive: 대소문자 상관없이 검색하기 옵션

 

 

swift의 고차함수(filter, map)을 사용하게 된다면 데이터를 뷰로 꺼내와서 필터링하는 것이다. 일단은 데이터베이스에서 많은 데이터를 꺼내온 후 필터링을 하기 때문에 효율적이지 못하다.

Realm의 쿼리문을 사용하여 필터링을 하게 되면 데이터를 꺼내오기 전에 필터링을 하는 것이기 때문에 효율이 더 좋다.

🔎 Update

pk로 수정할 레코드에 접근한다.

레코드 수정 후 트랜잭션에 수정 요청을 한다.

Untitled.png

.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

Untitled.png

'iOS > UIKit&SwiftUI' 카테고리의 다른 글

[iOS/Swift] MapKit - 위치 권한 설정을 구현해보자!  (1) 2023.10.01
[iOS/Swift] Realm - 백업 및 복구 구현하기  (3) 2023.09.16
[iOS/Swift] Realm - Migration  (1) 2023.09.16
[iOS/Swift] Realm - 이미지 파일 저장하기  (0) 2023.09.16
iOS 13 이후의 앱의 라이프 사이클 & available  (2) 2023.07.30
'iOS/UIKit&SwiftUI' 카테고리의 다른 글
  • [iOS/Swift] Realm - 백업 및 복구 구현하기
  • [iOS/Swift] Realm - Migration
  • [iOS/Swift] Realm - 이미지 파일 저장하기
  • iOS 13 이후의 앱의 라이프 사이클 & available
김졀니
김졀니
🍎 iOS 개발
  • 김졀니
    졀니의 개발 공부✨
    김졀니
  • 전체
    오늘
    어제
    • 분류 전체보기
      • iOS
        • Swift
        • UIKit&SwiftUI
        • RxSwift&Combine
        • WWDC
      • Study
        • 🚨 TroubleShooting
        • 🌱 SeSAC
  • 블로그 메뉴

    • 홈
    • Github
  • 인기 글

  • 최근 글

  • 태그

    traits
    mainactor
    ios
    Sendable
    Realm
    clipstobounds
    CLLocation
    동시성프로그래밍
    Drawing Cycle
    concurrency
    위치 권한
    displayPriority
    의존성 주입
    OperationQueue
    kingfisher header
    wwdc23
    Swift
    pointfree
    인앱리뷰
    FileManager
    layoutIfNeeded
    observable
    @PropertyWrapper
    ReactorKit
    swift concurrency
    이미지 캐싱
    RxSwift
    mapkit
    swiftdata
    actor
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
김졀니
[iOS/Swift] Realm - CRUD
상단으로

티스토리툴바