728x90
반응형
0123456
//
// AddViewController.swift
// SQLite
//
// Created by Mac on 2020/08/31.
// Copyright © 2020 MyMac. All rights reserved.
//
import UIKit
import SQLite3 // SQLite3는 기본적으로 안에 있다. // SQLite는 한글 처리가 잘 안되어 있지만 최근 좋아지고 있다 그러나 항상 영문을 기반으로 두고 봐야 한다.
class AddViewController: UIViewController {
@IBOutlet weak var txtName: UITextField!
@IBOutlet weak var txtDept: UITextField!
@IBOutlet weak var txtPhone: UITextField!
var db: OpaquePointer?
var studentList = [Students]()
override func viewDidLoad() {
super.viewDidLoad()
// SQLite 생성하기
// 어디에 저장을 할 지 정한다.
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("StudentsData.sqlite") // 있으면 만들고 없으면 만들지 말라는 뜻
if sqlite3_open(fileURL.path, &db) != SQLITE_OK{ // 해당 파일이 없으면 만들어라
print("error opening database")
}
}
func tempInsert() {
var stmt: OpaquePointer?
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
let name = txtName.text?.trimmingCharacters(in: .whitespacesAndNewlines)
let dept = txtDept.text?.trimmingCharacters(in: .whitespacesAndNewlines)
let phone = txtPhone.text?.trimmingCharacters(in: .whitespacesAndNewlines)
let queryString = "INSERT INTO students(sname, sdept, sphone) VALUES (?,?,?)"
if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 1, name, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding name: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 2, dept, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding dept: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 3, phone, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding phone: \(errmsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure insert data: \(errmsg)")
return
}
}
@IBAction func btnInsert(_ sender: UIButton) {
// alert을 주면 사용자가 좋아한다.
// 버튼 완료 후 얼랑 창이 뜨고 데이터는 넘어간다.
let resultAlert = UIAlertController(title: "결과", message: "정보가 입력되었습니다.", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "네", style: UIAlertAction.Style.default, handler: {Action in self.navigationController?.popViewController(animated: true
)})
resultAlert.addAction(okAction)
present(resultAlert, animated: true, completion: nil) // 알림창 띄우는 것
tempInsert()
print("Student update successfully")
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
} // --------------
//
// EditViewController.swift
// SQLite
//
// Created by Mac on 2020/08/31.
// Copyright © 2020 MyMac. All rights reserved.
//
import UIKit
import SQLite3
class EditViewController: UIViewController {
@IBOutlet weak var tfId: UITextField!
@IBOutlet weak var tfName: UITextField!
@IBOutlet weak var tfDept: UITextField!
@IBOutlet weak var tfPhone: UITextField!
var receiveId = 0
var receiveName = ""
var receiveDept = ""
var receivePhone = ""
var db: OpaquePointer?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// 값을 들어온 것을 화면에 띄우는 곳
tfId.text = String(receiveId)
tfId.isUserInteractionEnabled = false // Read Only
tfName.text = receiveName
tfDept.text = receiveDept
tfPhone.text = receivePhone
// SQLite 생성하기
// 어디에 저장을 할 지 정한다.
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("StudentsData.sqlite") // 있으면 만들고 없으면 만들지 말라는 뜻
if sqlite3_open(fileURL.path, &db) != SQLITE_OK{ // 해당 파일이 없으면 만들어라
print("error opening database")
}
}
// 값이 들어오는 구간 id, name, dept, phone
// table view 컨트롤에서
func receiveItems(_ id: Int, _ name: String, _ dept: String, _ phone: String){
receiveId = id
receiveName = name
receiveDept = dept
receivePhone = phone
}
@IBAction func btnUpdate(_ sender: UIButton) {
var stmt: OpaquePointer?
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
let id = tfId.text // 수정칸에서 아이디 값은 read only 이다 그래서 따로 건들필요가 없다.
let name = tfName.text?.trimmingCharacters(in: .whitespacesAndNewlines)
let dept = tfDept.text?.trimmingCharacters(in: .whitespacesAndNewlines)
let phone = tfPhone.text?.trimmingCharacters(in: .whitespacesAndNewlines)
let queryString = "UPDATE students SET sname = ?, sdept = ?, sphone = ? WHERE sid = ?"
// 순서는 물음표 부터 시작이다.
if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 1, name, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding name: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 2, dept, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding dept: \(errmsg)")
return
}
if sqlite3_bind_text(stmt, 3, phone, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding phone: \(errmsg)")
return
}
// 중간에 아이디 값이 들어가야 한다. sqlite integer가 민감하다.
if sqlite3_bind_int(stmt, 4, (id! as NSString).intValue) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding id: \(errmsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE{ // DONE 을 해줘야 다음 알림창으로 넘어간 다음 리스트 목록으로 넘어간다.
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure update data: \(errmsg)")
return
}
// alert을 주면 사용자가 좋아한다.
// 버튼 완료 후 얼랑 창이 뜨고 데이터는 넘어간다.
let resultAlert = UIAlertController(title: "결과", message: "정보가 수정되었습니다.", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "네", style: UIAlertAction.Style.default, handler: {Action in self.navigationController?.popViewController(animated: true // Action 지금은 Show로 와서 pop으로 불러서 위에 올라온 화면 없어진다. 그리고 실행한다.
)})
resultAlert.addAction(okAction)
present(resultAlert, animated: true, completion: nil)
print("Student update successfully")
}
@IBAction func btnDelete(_ sender: UIButton) {
var stmt: OpaquePointer?
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
let id = tfId.text // 아이디 값은 read only 이다 그래서 따로 건들필요가 없다.,
let queryString = "DELETE FROM students WHERE sid = ?"
// 순서는 물음표 부터 시작이다.
if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
// 중간에 아이디 값이 들어가야 한다. sqlite integer가 민감하다.
if sqlite3_bind_int(stmt, 1, (id! as NSString).intValue) != SQLITE_OK{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding id: \(errmsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE{
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure delete data: \(errmsg)")
return
}
// alert을 주면 사용자가 좋아한다.
// 버튼 완료 후 얼랑 창이 뜨고 데이터는 넘어간다.
let resultAlert = UIAlertController(title: "결과", message: "정보가 삭제 되었습니다.", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "네", style: UIAlertAction.Style.default, handler: {Action in self.navigationController?.popViewController(animated: true // Action 지금은 Show로 와서 pop으로 불러서 위에 올라온 화면 없어진다. 그리고 실행한다.
)})
resultAlert.addAction(okAction)
present(resultAlert, animated: true, completion: nil)
print("Student delete successfully")
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
} //----------
반응형