みなさんこんにちは。夢はフリーランスエンジニアのあがです。今回は前回の続きから初めて行こうと思います!!
前回の記事はこちらから
『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 = ""
}
次回予告
書き方はわかったので配列の書き込み方など応用編を書いてみようかな?と思います!!
永久保存版を作ろうと思うので必見です!!