여러분, 안녕하세요! 이 기사에서는 iOS 앱에 Realm 데이터베이스를 추가하는 방법을 배울 것입니다.
Realm 데이터베이스에서 CRUD(Create, Read, Update, Delete) 작업을 수행하는 방법을 배울 수 있도록 간단한 ToDo 앱을 만들 것입니다.
영역이란 무엇입니까?
Realm은 개발자 친화적이고 사용하기 쉬운 오픈 소스 모바일 데이터베이스입니다. iOS 앱에서 Core Data의 대안으로 사용할 수도 있습니다.
Realm은 크로스 플랫폼 모바일 데이터베이스입니다. 즉, 네이티브 Android 및 iOS 앱과 React Native를 사용하여 만든 것과 같은 크로스 플랫폼 앱에서도 사용할 수 있습니다. Objective-C, Swift, Java, Kotlin, C# 및 JavaScript를 지원합니다.
iOS 프로젝트에서 Realm을 설정하는 방법
SPM(Swift Package Manager), Cocoa Pods 또는 Carthage를 사용하여 iOS 프로젝트에 Realm을 추가할 수 있습니다. 여기서는 Cocoa Pod를 사용하여 iOS 프로젝트에 Realm Pod를 추가합니다.
- Xcode를 열고 Core Data를 사용하지 않고 UIKit 및 Swift로 빈 iOS 앱 프로젝트를 만듭니다.
- 이제 Xcode를 닫고 터미널을 엽니다. 터미널을 사용하여 프로젝트 디렉토리로 이동합니다.
- 다음 명령을 실행하여 PodFile을 만듭니다.
pod init
4. 이제 디렉토리의 내용을 나열하면 새 Podfile이 있는 것을 볼 수 있습니다. 텍스트 편집기를 사용하여 파일을 엽니다(여기서는 Vim을 사용했습니다). 아래 이미지와 유사하게 보이도록 Podfile을 편집합니다. Podfile을 저장하고 닫습니다.
이제 Realm DB에 대한 종속성을 지정했으므로 아래 명령을 실행하여 종속성을 설치할 수 있습니다.
pod install
보시다시피 iOS 프로젝트에 Realm DB 종속성을 성공적으로 추가했습니다. 이제 아래 명령을 실행하여 Xcode에서 프로젝트를 엽니다.
open YOUR_APP_NAME.xcworkspace
참고:Xcode를 연 후 Command+B를 눌러 프로젝트를 빌드해야 합니다.
Realm에서 사용자 인터페이스를 디자인하는 방법
우리는 앱의 UI를 단순하게 유지할 것입니다. Main.storyboard를 열고 프로토타입 셀이 있는 테이블 뷰를 추가하여 아래와 같이 간단한 UI를 만듭니다. 그런 다음 탐색 컨트롤러를 포함하고 ViewController.swift 파일에서 tableview에 대한 IBOutlet을 만듭니다.
Realm에서 데이터 모델을 만드는 방법
ToDo 앱에서 각 작업에는 작업 이름과 작업 ID가 있습니다. 우리는 할 일을 나타내는 Model 클래스를 만들 것입니다. 프로젝트 내비게이터에서 우클릭하여 새로운 Swift 파일을 생성하고 아래 코드를 추가합니다.
import Foundation
import RealmSwift
class ToDoTask:Object
{
@objc dynamic var tasknote: String?
@objc dynamic var taskid: String?
}
그녀는 ToDoTask라는 모델 클래스를 만들었습니다. RealmDB와 함께 제공되는 클래스인 Object 클래스를 상속합니다. 이 클래스는 이 모델 클래스를 사용하여 생성된 데이터를 데이터베이스에 저장하는 모든 내부 프로세스를 처리합니다.
또한 두 가지 속성을 추가했습니다. tasknote
, 수행할 작업 및 taskid
– 둘 다 문자열 유형입니다. @objc
Swift 코드가 Objective C 및 dynamic
에서 볼 수 있음을 의미합니다. Objective C 동적 디스패치를 사용하려는 것을 의미합니다.
기본 CRUD 앱 기능
우리 앱은 다음 기능을 수행합니다:
- AlertViewController를 사용하여 사용자로부터 입력 받기
- 데이터베이스와 테이블 보기에 입력을 추가합니다.
- 사용자가 입력 내용을 수정할 수 있도록 허용합니다.
- 테이블 보기와 데이터베이스 모두에서 데이터를 제거하려면 스와이프하여 행을 삭제합니다.
- 데이터베이스에서 모든 데이터(있는 경우)를 가져와 테이블 보기에 표시합니다.
AlertViewController를 사용하여 사용자로부터 입력을 받는 방법
ViewController.swift
열기 ViewDidLoad()
안에 아래 코드를 추가하세요. 방법. 그리고 addTask()
이라는 새 함수를 만듭니다. 사용자로부터 입력을 받기 위해 텍스트 상자와 함께 경고 보기 컨트롤러를 표시하는 코드를 추가합니다.
이제 오른쪽 막대 버튼을 누르면 addTask()
이 호출됩니다. alertviewcontroller
을 표시하는 함수 텍스트 필드를 사용하여 사용자 입력을 얻습니다.
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .add, style: .done, target: self, action: #selector(addTask))
navigationController?.navigationBar.prefersLargeTitles = true
title = "RealmDB"
@objc
func addTask()
{
let ac = UIAlertController(title: "Add Note", message: nil, preferredStyle: .alert)
ac.addTextField(configurationHandler: .none)
ac.addAction(UIAlertAction(title: "Add", style: .default, handler: { (UIAlertAction) in
if let text = ac.textFields?.first?.text
{
print(text)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(ac, animated: true, completion: nil)
}
데이터베이스 및 테이블 보기에 입력을 추가하는 방법
데이터를 Realm에 저장하려면 먼저 CRUD 작업에 필요한 모든 메서드에 액세스할 수 있는 Realm용 인스턴스를 얻어야 합니다. ViewController.swift
에서 Realm 유형의 속성을 만듭니다. 파일을 만들고 viewDidLoad()
에서 초기화합니다. 방법.
var realmDB: Realm!
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .add, style: .done, target: self, action: #selector(addTask))
navigationController?.navigationBar.prefersLargeTitles = true
title = "RealmDB"
realmDB = try! Realm()
}
DataModel(ToDoTask) 유형의 빈 배열을 만듭니다. 이 배열은 테이블 보기와 데이터베이스에 추가해야 하는 모든 작업을 보유합니다.
이제 addTask()
내부 함수는 사용자 입력을 받고 해당 입력에 대한 임의의 ID를 생성하도록 Add 액션 클로저를 수정합니다. 그런 다음 배열에 추가하고 데이터베이스에 저장합니다.
var tasks = [ToDoTask]()
if let text = ac.textFields?.first?.text
{
//Add data to data model array
let t = ToDoTask()
t.taskid = UUID().uuidString
t.tasknote = text
self.tasks.append(t)
//Add data to database
try! self.realmDB.write {
self.realmDB.add(t)
}
//Update table view UI
self.tasktv.reloadData()
}
이제 앱을 실행하면 데이터가 데이터베이스에 저장됩니다. 그러나 대리자 메서드를 구현하지 않았기 때문에 테이블 보기에는 표시되지 않습니다.
ViewController 클래스가 UITableViewDelegate
을 구현하도록 합니다. 및 UITableViewDataSource
프로토콜을 추가하고 프로토콜 스텁을 추가합니다.
이제 numberOfRowsInSection
내부 메서드에서 테이블 보기에 추가할 행 수를 제공하는 작업 배열의 개수를 반환합니다. 이것은 작업 배열의 요소 수와 같습니다.
func tableView(_ tableView: UITableView, numberOfRowsInSection section:
Int) -> Int
{
return tasks.count;
}
다음으로 해야 할 일은 각 행의 내용을 지정하는 것입니다. cellForRowAt
을 사용하여 이 작업을 수행할 수 있습니다. 델리게이트 메소드 여기서 스토리보드에서 언급한 식별자를 사용하여 셀을 큐에서 빼고 레이블 텍스트를 작업 배열 요소 tasknote 속성으로 지정합니다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
{
cell.textLabel?.text = tasks[indexPath.row].tasknote
return cell
}
return UITableViewCell()
}
사용자가 입력 내용을 편집하도록 허용하는 방법
이제 사용자가 입력한 작업을 편집하고 데이터베이스와 UI 모두에서 변경 사항을 업데이트할 수 있도록 해야 합니다. 사용자로부터 입력을 받는 유사한 방법을 사용하여 이를 수행할 수 있습니다. didSelectRowAt
구현 사용자가 테이블 보기 행을 탭할 때 호출될 대리자 메서드입니다.
AlertViewController
을 표시하는 아래 코드를 추가하십시오. 텍스트 보기와 함께. 그런 다음 입력한 텍스트로 셀의 내용을 업데이트함과 동시에 데이터베이스 내용을 업데이트합니다.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let tasktomodify = tasks[indexPath.row]
let ac = UIAlertController(title: "Update task", message: nil, preferredStyle: .alert)
ac.addTextField(configurationHandler: .none)
ac.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (UIAlertAction) in
if let text = ac.textFields?.first?.text
{
if(!text.isEmpty)
{
try! self.realmDB.write({
tasktomodify.tasknote = text
})
self.tasktv.reloadData()
}
}
}))
present(ac, animated: true, completion: nil)
}
스와이프하여 행 삭제 및 제거 방법 테이블 뷰와 데이터베이스의 데이터
여기에서는 사용자가 작업을 삭제할 수 있도록 테이블 보기에서 스와이프하여 삭제 기능을 구현합니다. 그러나 내부적으로 사용자 스와이프가 테이블 뷰 행을 삭제하면 데이터베이스, 데이터 모델 배열에서 데이터를 삭제하고 테이블 뷰의 UI를 업데이트해야 합니다.
편집 스타일 커밋 을 구현하여 이를 수행할 수 있습니다. 대리자 메서드 및 다음 코드 추가:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete
{
let tasktoDelete = tasks[indexPath.row]
try! realmDB.write({
realmDB.delete(tasktoDelete)
self.tasks.remove(at: indexPath.row)
self.tasktv.deleteRows(at: [indexPath], with: .fade)
})
}
}
모든 데이터를 가져오는 방법(만약 존재) 데이터베이스에서 테이블 보기에 표시
이제 마지막 작업인 읽기를 구현합니다. 사용자가 앱을 시작할 때마다 데이터베이스에서 데이터를 가져와(데이터가 있는 경우) 테이블 보기에 표시해야 합니다.
getTodo
함수를 만들어 이를 수행할 수 있습니다. 뷰 컨트롤러 swift 파일에 다음 코드를 추가합니다.
func getTodos()
{
//Get all the data from the database
let notes = realmDB.objects(ToDoTask.self)
//Clear the model data array to prevent duplicates
self.tasks.removeAll()
/*If the fetched data is not empty then add it to model data array and update the UI */
if(!notes.isEmpty)
{
for n in notes
{
self.tasks.append(n)
}
self.tasktv.reloadData()
}
}
보너스 팁:iOS 시뮬레이터에서 데이터베이스 콘텐츠를 보는 방법
이제 앱을 실행하면 예상대로 작동하는 것을 볼 수 있습니다. 그러나 데이터가 실제로 데이터베이스에 저장되어 있는지 어떻게 확인할 수 있습니까? 시뮬레이터의 Realm 데이터베이스에 저장된 데이터를 볼 수 있는 MongoDB Realm Studio라는 앱을 사용할 수 있습니다.
이 방법은 iOS 시뮬레이터를 사용하여 앱을 테스트할 때만 작동합니다.
viewDidLoad()
에서 메서드에서 앱의 실제 파일 경로를 인쇄할 아래 코드 줄을 추가합니다.
print(realmDB.configuration.fileURL!)
이제 콘솔에 인쇄된 파일 경로를 복사하고 터미널을 열고 다음 명령을 실행합니다.
open REALM_FILE_PATH_HERE
위의 명령을 실행하기 전에 브라우저에서 MongoDB Realm Studio를 다운로드했는지 확인하세요.
이제 MongoDB Realm Studio에서 앱의 RealmFile을 엽니다. 이렇게 하면 데이터베이스에 저장된 데이터가 테이블 형식으로 표시됩니다.
작업을 편집하거나 삭제하여 데이터를 변경하면 변경 사항이 MongoDB Realm Studio 앱에 반영됩니다.
축하합니다! iOS 앱에서 CRUD 작업을 구현하는 간단한 앱을 만들었습니다.