0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RealmSwiftを使ってみよう!!Part3

Posted at

みなさんこんにちは。夢はフリーランスエンジニアのあがです。今回は前回の続きから初めて行こうと思います!!
前回の記事はこちらから
RealmSwiftを使ってみよう!!Part1
RealmSwiftを使ってみよう!!Part2
では早速変更する部分について書いていこうと思います!!

Step1:ライブラリを入れよう!!

うえ!と難しそうと思うかもしれませんが超簡単です!!
コードの一番上に追加してください!!

ViewController.swift
import UIKit
import RealmSwift//これを追加

Step2:実際に保存するデータベースを作る

データベースの作り方は『公式サイト』にある通り以下のようなコードを用います!!

公式サイトのコード
class Dog: Object {
    @objc dynamic var name = ""
    @objc dynamic var age = 0
}
class Person: Object {
    @objc dynamic var name = ""
    @objc dynamic var picture: Data? = nil // optionals supported
    let dogs = List<Dog>()
}

//インスタンスを取ってくる
let myDog = Dog()
myDog.name = "Rex"
myDog.age = 1
print("name of dog: \(myDog.name)")

//Realmを呼び出す
let realm = try! Realm()

//2歳未満の犬だけ読み取る
let puppies = realm.objects(Dog.self).filter("age < 2")
puppies.count //0が表示されるよね・・・だってまだ読み込ませてないから・・・

//データの読み込まし方
try! realm.write {
    realm.add(myDog)
}

puppies.count //Rexは2歳未満の犬よりカウントは1になる

//更新の仕方はこんな感じ
DispatchQueue(label: "background").async {
    autoreleasepool {
        let realm = try! Realm()
//ここで1歳で登録されている犬を取ってくる
        let theDog = realm.objects(Dog.self).filter("age == 1").first
//theDogに読み込ませているのでその値を3歳に更新する(今回はフィルターがないことに注意!!)
        try! realm.write {
            theDog!.age = 3
        }
    }
}

ということが公式サイトには書かれていました。
このようにGithubに書かれていることを参考にしながらコードを試していくことが大切です!!

前回お話しした変更箇所4つを公式サイトを参考に変更する

それぞれ(旧版)から(新版)に適宜変更させてください!!

ViewController.swift(旧版)
@objc func saveButton(_ sender:Any){

//ここの部分を編集していきます!!
        print("ここに\(String(describing: name.text))\(String(describing: age.text))を保存したい!!")


        name.text = ""
        age.text = ""
        saveButton.isEnabled = false
        saveButton.alpha = 0.2
    }
ViewController.swift(新版)
@objc func saveButton(_ sender:Any){
        
        print("ここに\(String(describing: name.text))\(String(describing: age.text))を保存したい!!")

//追加した部分の始まり
//guard letでnilチェックを行う[nil(値が何もない)状態をなくす]
        guard let checkedName = name.text else{return}
        guard let checkedAge = age.text else{return}
//Realmを読み込む
        let realm = try! Realm()
//TeamDataBaseのインスタンスを読み込む
        let teamDataBase = TeamDataBase()
//文字列をそれぞれTeamDataBaseの中に文字列を引き渡す
        teamDataBase.name = checkedName
        teamDataBase.age = checkedAge
//引き渡された文字列をrealmの中に読み込ませる
        try! realm.write {realm.add(teamDataBase)}
//読み込ませたことによりTableViewを更新するさせる
        tableView.reloadData()
//追加した部分の終わり

        name.text = ""
        age.text = ""
        saveButton.isEnabled = false
        saveButton.alpha = 0.2
    }

saveButtonの動き方はこんな感じです。続けてTableViewの更新をしていこうと思います!!

ViewController.swift(旧版)
extension ViewController:UITableViewDelegate,UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//ここの部分を編集していきます!!
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle,
                                   reuseIdentifier:cellId)
//ここの部分を編集していきます!!
        cell.textLabel?.text = "ここに名前が入ります"
        cell.detailTextLabel?.text = "ここに年齢が入ります"
        return cell
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
//ここの部分を編集していきます!!
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}

ViewController.swift(新版)
extension ViewController:UITableViewDelegate,UITableViewDataSource{

//セルの表示する数を指定する
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//Realmを読み込ませる
        let realm = try! Realm()
//DataBaseの情報をteamDataBaseに読み込ませる
        let teamDataBase = realm.objects(TeamDataBase.self)
//.countを用いることでデータ数を読み込みその値を表示させる
        return teamDataBase.count
    }

//セルのデータを指定する
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//セルのインスタンスを取得する
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle,
                                   reuseIdentifier:cellId)
//Realmを読み込ませる
        let realm = try! Realm()
//DataBaseの情報をteamDataBaseに読み込ませる
        let teamDataBase = realm.objects(TeamDataBase.self)
//nameとageを[indexPath.row(セルを上から順番に読み込ます操作)]で読み込ませる
        cell.textLabel?.text = teamDataBase[indexPath.row].name
        cell.detailTextLabel?.text = teamDataBase[indexPath.row].age
//セルの情報を返す
        return cell
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
//Realmを読み込ませる
            let realm = try! Realm()
//DataBaseの情報をteamDataBasesに読み込ませる
            let teamDataBases = realm.objects(TeamDataBase.self)
//選択したcellの部分をteamDataBaseに読み込ませる
            let teamDataBase = teamDataBases[indexPath.row]
//teamDataBaseの情報を削除する
            try! realm.write {realm.delete(teamDataBase)}
//消した部分のセルを消して下のセルを1つセル番号を上げる
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}

このコードを参考にして情報をtableViewを更新するコードを書いてみてください!!

最後に全コードを載せておきたいと思います!!

ViewController.swift
import UIKit
import RealmSwift

class ViewController: UIViewController {

    var name:UITextField!
    var age:UITextField!
    var myTextView: UITextView!
    var nameLabel:UILabel!
    var ageLabel:UILabel!
    var saveButton:UIButton!
    var tableView: UITableView!
    let cellId = "cellId"
    let margin:CGFloat = 10
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let frameX = self.view.frame.width
        let frameY = self.view.frame.height
        let topUI = CGFloat(50)
        let buttomUI = CGFloat(50)
        let LabelX = CGFloat(150)
        let LabelY = CGFloat(50)
        
        let kbToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 40))
            kbToolBar.barStyle = UIBarStyle.default
            kbToolBar.sizeToFit()
        let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil)
        let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.commitButtonTapped(_:)))
         kbToolBar.items = [spacer, commitButton]
         

       
        
        nameLabel = UILabel(frame: CGRect(x: margin, y: topUI, width: LabelX, height: LabelY))
        nameLabel.textAlignment = .center
        nameLabel.font =  UIFont.boldSystemFont(ofSize: 30)
        nameLabel.text = "名前"
        nameLabel.backgroundColor = keyakiColor
        self.view.addSubview(nameLabel)
        
        name = UITextField(frame: CGRect(x: nameLabel.frame.maxX+margin, y: nameLabel.frame.minY, width: frameX-margin*3-LabelX, height: LabelY))
        name.backgroundColor = hinataColor
        name.inputAccessoryView = kbToolBar
        self.view.addSubview(name)
        
        
        ageLabel = UILabel(frame: CGRect(x: margin, y: nameLabel.frame.maxY+margin, width: LabelX, height: LabelY))
        ageLabel.textAlignment = .center
        ageLabel.font =  UIFont.boldSystemFont(ofSize: 30)
        ageLabel.text = "年齢"
        ageLabel.backgroundColor = keyakiColor
        self.view.addSubview(ageLabel)
        
        age = UITextField(frame: CGRect(x: ageLabel.frame.maxX+margin, y: ageLabel.frame.minY, width: frameX-margin*3-LabelX, height: LabelY))
        age.backgroundColor = hinataColor
        age.inputAccessoryView = kbToolBar
        age.keyboardType = UIKeyboardType.numberPad
        self.view.addSubview(age)
        
        saveButton = UIButton(frame: CGRect(x: margin, y: ageLabel.frame.maxY+margin, width: frameX-margin*2, height: LabelY))
        saveButton.addTarget(self, action: #selector(self.saveButton(_:)), for: .touchUpInside)
        saveButton.setTitle("保存", for: .normal)
        saveButton.setTitleColor(.white, for: .normal)
        saveButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 30)
        saveButton.backgroundColor = nogizakaColor
        saveButton.layer.cornerRadius = 20
        saveButton.alpha = 0.2
        saveButton.isEnabled = false
        self.view.addSubview(saveButton)
        
        tableView = UITableView(frame: CGRect(x: margin, y: topUI+margin*3+LabelY*3, width: frameX-margin*2, height:frameY-topUI-margin*3-LabelY*3-buttomUI))
        tableView.backgroundColor = nogizakaColor
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        tableView.tableFooterView = UIView(frame: .zero)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.layer.borderColor = nogizakaColor.cgColor
        tableView.layer.borderWidth = 3.0
        tableView.layer.cornerRadius = 20
        tableView.allowsSelection = false
        self.view.addSubview(tableView)
    }
    
    @objc func commitButtonTapped (_ sender:Any){
        if name.text != "" && age.text != ""{
            saveButton.isEnabled = true
            saveButton.alpha = 1.0
        }else{
            saveButton.isEnabled = false
            saveButton.alpha = 0.2
        }
        self.view.endEditing(true)
    }
    
    
    @objc func saveButton(_ sender:Any){
        
        print("ここに\(String(describing: name.text))\(String(describing: age.text))を保存したい!!")
        
        guard let checkedName = name.text else{return}
        guard let checkedAge = age.text else{return}
        let realm = try! Realm()
        let teamDataBase = TeamDataBase()
        teamDataBase.name = checkedName
        teamDataBase.age = checkedAge
        try! realm.write {realm.add(teamDataBase)}
        tableView.reloadData()
        
        name.text = ""
        age.text = ""
        saveButton.isEnabled = false
        saveButton.alpha = 0.2
    }

}
extension ViewController:UITableViewDelegate,UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let realm = try! Realm()
        let teamDataBase = realm.objects(TeamDataBase.self)
        return teamDataBase.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle,
                                   reuseIdentifier:cellId)
        let realm = try! Realm()
        let teamDataBase = realm.objects(TeamDataBase.self)
        cell.textLabel?.text = teamDataBase[indexPath.row].name
        cell.detailTextLabel?.text = teamDataBase[indexPath.row].age
        return cell
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            // Delete the row from the data source
            let realm = try! Realm()
            let teamDataBases = realm.objects(TeamDataBase.self)
            let teamDataBase = teamDataBases[indexPath.row]
            try! realm.write {realm.delete(teamDataBase)}
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}



extension UIColor{
    static func rgb(r:CGFloat,g:CGFloat,b:CGFloat) -> UIColor{
        return self.init(red: r/255, green: g/255, blue: b/255, alpha: 1.0)
    }
}

let keyakiColor = UIColor.rgb(r: 160, g: 212, b: 104)
let nogizakaColor = UIColor.rgb(r: 190, g: 134, b: 200)
let hinataColor = UIColor.rgb(r: 124, g: 200, b: 233)

class TeamDataBase: Object{
    @objc dynamic var name = ""
    @objc dynamic var age = ""
}

次回予告

書き方はわかったので配列の書き込み方など応用編を書いてみようかな?と思います!!
永久保存版を作ろうと思うので必見です!!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?