Realm을 사용하기에 앞서 관련 파일들을 모아놓기 위해 폴더를 따로 구성하는 것이 좋음!
📂 Realm
ㄴ 📑 RealmModel.swift
import RealmSwift
class UserDiary: Object {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var diaryTitle: String // 제목(필수)
@Persisted var content: String? // 내용(옵셔널)
@Persisted var writeDate = Date() // 날짜(필수)
@Persisted var regDate = Date() // 등록일(필수)
@Persisted var favorite: Bool // 즐겨찾기 기능(필수)
convenience init(diaryTitle: String, content:String?, writeDate: Date, regDate: Date) {
self.init()
self.diaryTitle = diaryTitle
self.content = content
self.writeDate = writeDate
self.regDate = regDate
self.favorite = false
}
}
import RealmSwift
class ViewController: UIViewController {
// iphone 내부에 저장된 realm 파일의 주소를 찾아서 알려주는 코드
let localRealm = try! Realm()
override func viewDidLoad() {
super.viewDidLoad()
// 이 코드를 통해 현재 Realm파일이 저장된 위치의 주소를 확인할 수 있음
// 해당 주소를 이용해 Realm파일에 바로 접근하여 저장된 데이터를 확인할 수 있음
print("Realm is located at:", localRealm.configuration.fileURL!)
}
@objc func saveButtonClicker() {
// 작성해둔 데이터를 선언해둔 테이블 형식(UserDiary)으로 생성 후 데이터를 저장하는 코드
let task = UserDiary(diaryTitle: titleTextField.text!, content: contentTextView.text, writeDate: Date(), regDate: Date())
try! localRealm.write {
localRealm.add(task)
}
}
}
import RealmSwift
class ViewController: UIViewController {
let localRealm = try! Realm()
// UserDiary 형식의 데이터를 담고 있는 배열
var tasks: Results<UserDiary>!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 저장된 데이터를 받아오는 코드
// viewWillAppear 안에 해당 코드를 작성해주면 다른 view에서 데이터를 추가하고 해당 view로 돌아올때마다 데이터가 업데이트되는 것을 확인할 수 있음!
// 이 단계에서 원하는 내용만 필터링하거나 정렬하는 등 원하는 형태로 변형할 수 있음
// ex. tasks = localRealm.objects(Userdiary.self).sorted(byKeyPath: "diaryTitle", ascending: false)
// 별다른 정렬과정 없이 데이터를 불러오면 데이터의 순서가 보장되지 않기 때문에 사용자 경험을 고려했을 때 데이터를 불러온 후 정렬을 하는 것이 권장됨
tasks = localRealm.objects(Userdiary.self)
}
}
extension SearchViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tasks.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: searchTableViewCell.identifier, for: indexPath) as? searchTableViewCell else {
return UITableViewCell()
}
let task = tasks[indexPath.row]
cell.titleLabel.text = task.diaryTitle
cell.contentLabel.text = task.content
return cell
}
}