개발자 코드(Code)/Swfit

IOS) SQLite + CRUD (생성+읽기+갱신+삭제)+(Navigation + TableView+ViewController)

Chain X 2020. 9. 4. 10:13
728x90
반응형

0123456
SQLite + CRUD (생성+읽기+갱신+삭제)+(Navigation + TableView+ViewController)

 

//
//  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.
    }
    */


} //----------
반응형