Realm총 정리

작성일

총 정리

설치

pod 'RealmSwift'

AppDelegate.swift

import RelamSwift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    do {
        let _ = try Realm()
    } catch {
        print("Error initialising new realm, \(error)")
    } 
    return true
}

기본적인 사용법

do {
  let realm = try Realm()
 catch {
  print("Error initialising new realm, \(error)")
} 

데이터 확인하는 방법

Appdelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 
    print(Realm.Configuration.defaultConfiguration.fileURL)
}

출력된 파일 경로가 나오면, Realm Studio를 연후
command + shift + G 를 누르고 print된 경로를 복사 붙여 넣기 한다.
그러면, default.realm 파일이 있는데 눌러서 데이터를 확인할 수 있다.

!!앱스토어에서 RelamBrowser를 다운받았는데 encryption key을 요구한다면?!

https://studio-releases.realm.io/latest/download/mac-dmg 위 링크를 눌러서 다운받으시면 됩니다!!

데이터 모델 만드는법

Data.swift

import RealmSwift

class Date: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var age: Int = 0
}
  • 필요한 클래스이름으로 작성하면 된다.
  • @ojbc dynamic를 변수에 작성을 해야한다.

일대 다 설정하는 방법

하나의 카테고리가 여러개의 아이템을 담는 방법

Category.swift

import Foundation
import RealmSwift

class Category: Object {
    @objc dynamic var category: String = ""
    let items = List<Item>()
}

Item.swift

import Foundation
import RealmSwift

class Item: Object {
    @objc dynamic var title: String = ""
    @objc dynamic var done: Bool = false
    var parentCateory = LinkingObjects(fromType: Category.self, property: "items")
}

참고해서 1:n의 관계를 설정해 나가면 된다.
parentCateory는 내가 사용할 변수 이름이다. 바꾸면된다.
items는 내가 1에서 설정한 변수 이름이다.

CRUD

사용방법

VC에서

import RealmSwift

설정 해준후,

let realm = try! Realm()

realm 객체를 생성해준다.

쓰기

저장 하는 메서드에가서

fun save(category: Category) {
  do {
    try realm.write {
        realm.add(category)
    }
  } chtch {
    print("Error saving category \(error)")
  }
  tableView.reloadData()
}

이런식으로 저장할 클래스를 매개변수로받고, 그걸 저장해주면 된다.

읽기

전역 변수로 설정해주고

var categories: Result<Category>?

아래 함수로 불러오면 된다.

func loadCategories() {
  categories = realm.objects(Category.self)
}

AutoUpdate라고 하는데 아직 확인은 못해봤다. 프로젝트하면서 확인할 예정 + didSet를 활용해서 데이터를 추가해주면 좋을것 같다.

위에

categories: Result<Category>?

카테고리가 옵셔널 값이니 밑에서 사용할땐,

categories?.count ?? 1

이런식으로 Nil Coalescing Operator해줘야 한다.

불러올떄 오름차순 내림차순하는법

전역변수

let realm = try! Realm()
var itemArray = Results<Item>?

var selectedCategory: Category? {
  didSet{
    load
  }
}
func loadItems() {
  itemArray = selectedCategory?.items.sorted(byKeyPath: "title", ascending: true)

  tableView.reloadData()
}

이런방식으로 배열에 담을때 정렬하면서 리로드해주면 된다.

업데이트하기

didSelectRowAt에서

if let item = itemAraray?[indexPath.row] {
  try realm.write {
    // 업데이트할 내용
  } catch {
    print("Error saving done status, \(error)")
  }
}

삭제하기

didSelectRowAt에서

if let item = itemAraray?[indexPath.row] {
  try realm.write {
      realm.delete(item)
  } catch {
    print("Error saving done status, \(error)")
  }
}

Realm에서 사진(UIImage형)저장 방법

Data() 형으로 넣어줘야한다.
UIImage -> Data()

// UIImage -> Data
let data: Data = image?.jpegData(compressionQuality: 0.9)
 
// Data -> UIImage
let uiImage: UIImage = UIImage(data: imageData)

Realm객체를 다른 곳에서도 사용하게 만들기

static으로 선언 해주면된다.

ViewController.swift

    static let shared = ViewController()
    let realm = try! Realm()

접근하는 방법은

ViewController.shared.realm

이런식으로 접근해서 사용하면 된다.