k-coding

Realm ( 3 ) 본문

iOS/Xcode

Realm ( 3 )

chkhn_oiiu 2022. 4. 7. 23:15

오늘은 Realm을 활용하여 테이블뷰에 데이터베이스에 들어있는 값을 넣는 방법을 알아보겠습니다.

 

Realm 설치, Realm 기본 예제등등은 이전 포스트를 확인하요 주세요.

 

우선 프로젝트를 생성하시고

 

다음과 같이 storyboard를 작성해봅시다.

 

 

디자인이 엉망이지만 일단 넘어가자구요 :)

 

위에 보이는 Add버튼을 누르면 Realm에 데이터를 저장하고 Reset버튼을 누르면 편하게 데이터를 다 지워줄것입니다.

 

각각 할일, 시간 TextField를 통하여 cell에 있는 Label에 값을 보여게 할것입니다.

 

일단 IBOutlet를 연결을 다음과 같이 해줍시다!

 

class ViewController: UIViewController {
    
    @IBOutlet weak var workTF: UITextField!
    @IBOutlet weak var timeTF: UITextField!
    @IBOutlet weak var tableView: UITableView!
    
    @IBAction func btnPress(_ sender: UIButton) {
        save()
        tableView.reloadData()
        workTF.text = ""
        timeTF.text = ""
    }
    
    @IBAction func resetBtn(_ sender: UIButton) {
        reset()
        tableView.reloadData()
        workTF.text = ""
        timeTF.text = ""
    }
    
 }

 

일단 save, reset 메소드가 무슨 기능을 할지는 이따가 알아봅시다!

 

class ToDoTableViewCell: UITableViewCell {
    
    @IBOutlet weak var toDoWork: UILabel!
    @IBOutlet weak var toDoTime: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

이건 tableViewCell에 연결할 클래스에요 ! 여기도 각각 Label을 연결시켜줍시다!

 

테이블뷰를 생성해주어야겠죠?

 

이거 이전 테이블뷰 포스트나 다른분들 포스트에도 많이 다루는 내용이니까 생략하겠습니다!

 

let realm = try! Realm()

 

기본적으로 Realm을 다루기 위해서 realm이라는 상수를 만들어주셔야합니다

 

class ListArray: Object {
    var list = List<ToDoList>()
}


class ToDoList: Object {
    @objc dynamic var work: String = ""
    @objc dynamic var time: String = ""
}

 

그리고 제가 데이터를 저장 할 객체타입 클래스들입니다. 이정도 만들고 실행을 돌려주신다면?

 

RealmStudio를 확인해볼까요?

 

잘 구상되어있군요!

 

이제 이 데이터베이스에 값을 집어넣어봅시다 이전에 호출만 했었던 save, reset메서드를 다루어봅시다

 

 func save() {
        
        guard let workTF = workTF, let timeTF = timeTF  else {
            return
        }
        
        let myToDo = ToDoList()
        
        myToDo.work = workTF.text!
        myToDo.time = timeTF.text!
        
        if realm.objects(ListArray.self).isEmpty == true {
            let listArray = ListArray()
            listArray.list.append(myToDo)
            
            try! realm.write{
                realm.add(listArray)
            }
        } else {
            try! realm.write {
                            let listArray = realm.objects(ListArray.self)
                            listArray.first?.list.append(myToDo)
                    }
        }
        
    }

myToDo라는 상수를 통해 클래스 ToDoList를 받아주고 

 

if문을 통하여 ListArray 처음 저장하는지 아니면 기존의 array를 사용하는지 구분하여 데이터를 저장합니다.

 

func reset() {
        try! realm.write{
            realm.deleteAll()
        }
    }

deleteAll()을 통하여 한번에 Realm에 들어있는 모든 데이터를 지워줍니다.

 

자 이제 데이터가 저장되는지 확인해볼까요?

 

ToDoList
ListArray

성공적으로 두 DB에 데이터가 담기는 모습이군요!

 

그럼 테이블뷰 cell에 이 값들이 보이게 하기위해선 어떡하면 될까요?

 

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let myToDo = realm.objects(ToDoList.self)
        
        return myToDo.count
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let listArray = realm.objects(ListArray.self)
        let cell = tableView.dequeueReusableCell(withIdentifier: identify , for: indexPath) as! ToDoTableViewCell
        
        cell.toDoWork.text = listArray.first?.list[indexPath.row].work
        cell.toDoTime.text = listArray.first?.list[indexPath.row].time
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        
    }
}

 

먼저 ToDoList를 myToDo라는 상수로 다시 받아주고, Realm에 저장되어있는 데이터의 갯수만큼 cell을 받아줍시다.

 

밑에 cellForRowAt메소드를 통하여 ListArray를 받아와주고 각 cell의 Label을 listArray의 각 work와 time으로 받아줍니다.

 

ListArray가 기본적으로 ToDoList를 배열로 만든것이기 때문에 ToDoList의 work와 time변수를 사용할 수 있습니다.

 

자 이렇게 작성해주면

 

테이블뷰의 셀들은 저장된 데이터의 갯수만큼 저장되고,

 

각 셀들이 데이터베이스에 저장된 값들을 나타내주겠군요??!

 

확인해줍시다.

 

성공!!

 

정상적으로 Realm에 데이터들이 담겨있기때문에 앱을 완전히 껐다가 다시 실행하여도 다음과 같은 cell들은 남아있습니다.

 

근데 제 포스트만 따라하다보면 정상적으로 작동이 안되실거에요 제가 코드를 중간중간 생략했거든요!

 

혹시 직접 따라해보실분은 ViewController의 전체코드를 보고 따라해주시면 됩니다!

 

이상 정말 간단히 Realm을 활용하여 TableView에 데이터를 저장하는 방법을 알아보았습니다. 감사합니다!!

 

import UIKit
import RealmSwift


class ViewController: UIViewController {
    
    @IBOutlet weak var workTF: UITextField!
    @IBOutlet weak var timeTF: UITextField!
    @IBOutlet weak var tableView: UITableView!
    
    @IBAction func btnPress(_ sender: UIButton) {
        save()
        tableView.reloadData()  // tableView 갱신
        workTF.text = ""       
        timeTF.text = ""
    }
    @IBAction func resetBtn(_ sender: UIButton) {
        reset()
        tableView.reloadData()
        workTF.text = ""
        timeTF.text = ""
    }
    
    let realm = try! Realm()
    
    let identify: String = "cell" // tableViewCell 식별자
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        self.tableView.delegate = self   // tableView delegate,datasource 설정
        self.tableView.dataSource = self
        
    }
    
    
    func save() {
        
        guard let workTF = workTF, let timeTF = timeTF  else {
            return
        }
        
        let myToDo = ToDoList()
        
        myToDo.work = workTF.text!
        myToDo.time = timeTF.text!
        
        if realm.objects(ListArray.self).isEmpty == true {
            let listArray = ListArray()
            listArray.list.append(myToDo)
            
            try! realm.write{
                realm.add(listArray)
            }
        } else {
            try! realm.write {
                            let listArray = realm.objects(ListArray.self)
                            listArray.first?.list.append(myToDo)
                    }
        }
        
    }
    
    func reset() {
        try! realm.write{
            realm.deleteAll()
        }
    }


}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let myToDo = realm.objects(ToDoList.self)
        
        return myToDo.count
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let listArray = realm.objects(ListArray.self)
        let cell = tableView.dequeueReusableCell(withIdentifier: identify , for: indexPath) as! ToDoTableViewCell
        
        cell.toDoWork.text = listArray.first?.list[indexPath.row].work
        cell.toDoTime.text = listArray.first?.list[indexPath.row].time
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        
    }
}

class ListArray: Object {
    var list = List<ToDoList>()
}


class ToDoList: Object {
    @objc dynamic var work: String = ""
    @objc dynamic var time: String = ""
}

 

'iOS > Xcode' 카테고리의 다른 글

CoreData ( 1 )  (0) 2022.05.10
Swift 뷰의 상태변화 메서드  (0) 2022.04.09
Realm ( 2 )  (0) 2022.04.03
Realm ( 1 )  (0) 2022.03.30
Xcode Firebase를 이용한 간단한 로그인 구현하기  (0) 2022.02.16
Comments