簡體   English   中英

如何在 SQLite swift 4 中刪除 tableview 行

[英]How do I delete an tableview row in SQLite swift 4

我想知道如何從 SQLite 數據庫中刪除一行。 我實現了一個用於刪除項目的滑動方法。 我嘗試了幾件事,但仍然無法刪除該項目。

import UIKit
import SQLite3

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var db: OpaquePointer?
var brainList = [BrainDumpAdapter]()
var usesTallCells = false



@IBOutlet weak var tableViewHeroes: UITableView!
@IBOutlet weak var textFieldName: UITextField!
@IBOutlet weak var textFieldPowerRanking: UITextField!

@IBAction func buttonSave(_ sender: UIButton) {
    let name = textFieldName.text?.trimmingCharacters(in: .whitespacesAndNewlines)
    let powerRanking = textFieldPowerRanking.text?.trimmingCharacters(in: .whitespacesAndNewlines)

    if(name?.isEmpty)!{
        textFieldName.layer.borderColor = UIColor.red.cgColor
        return
    }

    if(powerRanking?.isEmpty)!{
        textFieldName.layer.borderColor = UIColor.red.cgColor
        return
    }

    var stmt: OpaquePointer?

    let queryString = "INSERT INTO BrainDump (name, pomodoro) 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, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure binding name: \(errmsg)")
        return
    }

    if sqlite3_bind_int(stmt, 2, (powerRanking! as NSString).intValue) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure binding name: \(errmsg)")
        return
    }

    if sqlite3_step(stmt) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure inserting hero: \(errmsg)")
        return
    }

    textFieldName.text=""
    textFieldPowerRanking.text=""

    readValues()

    print("Braindump succesfully saved")
}

//delete item sqlite
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCell.EditingStyle.delete {
        brainList.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)

        self.tableViewHeroes.reloadData()

    }
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}




//SQLITE
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print(brainList.count)
    return brainList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    let brainDump: BrainDumpAdapter
    brainDump = brainList[indexPath.row]
    cell.textLabel?.text = brainDump.name



    return cell
}


func readValues(){
    brainList.removeAll()

    let queryString = "SELECT * FROM BrainDump"

    var stmt:OpaquePointer?

    if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing insert: \(errmsg)")
        return
    }

    while(sqlite3_step(stmt) == SQLITE_ROW){
        let id = sqlite3_column_int(stmt, 0)
        let name = String(cString: sqlite3_column_text(stmt, 1))
        let pomodoro = sqlite3_column_int(stmt, 2)

        brainList.append(BrainDumpAdapter(id: Int(id), name: String(describing: name), pomodoro: Int(pomodoro)))
    }

    self.tableViewHeroes.reloadData()
}




override func viewDidLoad() {
    super.viewDidLoad()


    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        .appendingPathComponent("SQLiteDatabse.sqlite")


    if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
        print("error opening database")
    }

    if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS BrainDump (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, pomodoro INTEGER)", nil, nil, nil) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error creating table: \(errmsg)")
    }

    readValues()

}
}

func deleteBrainDumpItem(itemId: Int32){

    let deleteStatementStirng = "DELETE FROM BrainDump WHERE id = ?;"

    var deleteStatement: OpaquePointer? = nil
    if sqlite3_prepare_v2(db, deleteStatementStirng, -1, &deleteStatement, nil) == SQLITE_OK {

        sqlite3_bind_int(deleteStatement, 1, itemId)

        if sqlite3_step(deleteStatement) == SQLITE_DONE {
            print("Successfully deleted row.")
        } else {
            print("Could not delete row.")
        }
    } else {
        print("DELETE statement could not be prepared")
    }




    sqlite3_finalize(deleteStatement)


    print("delete")


}

我發現了,簡單的 SQL 查詢將為您完成這項工作。

在 UITableview 的 commiteditingStyle 方法中使用 tableview 刪除操作的工作代碼

import UIKit
import SQLite3

let kCell = "Cell"

class ViewController: UIViewController {

    @IBOutlet weak var tfHeroName: UITextField!
    @IBOutlet weak var tfPowerRanking: UITextField!
    @IBOutlet weak var btnSave: UIButton!

    var db: OpaquePointer?
    private let refreshControl = UIRefreshControl()

    @IBOutlet weak var tableView: UITableView!

    var heroList = [Hero]()


    override func viewDidLoad() {
        super.viewDidLoad()

        //SetupPullTorefresh

        // Add Refresh Control to Table View
        if #available(iOS 10.0, *) {
            tableView.refreshControl = refreshControl
        } else {
            tableView.addSubview(refreshControl)
        }

        // Configure Refresh Control
        refreshControl.addTarget(self, action: #selector(refreshListData(_:)), for: .valueChanged)
        refreshControl.tintColor = #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1)
        refreshControl.attributedTitle = NSAttributedString(string: "Loading...")

        //database file address
        let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
            .appendingPathComponent("HeroesDatabase.sqlite")

        //opening database
        if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
            print("error opening database")
        }

        //creating table
        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Heroes (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, powerrank INTEGER)", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")
        }

        readValues()

    }

    @IBAction func tapOnBtnSave(_ sender: Any) {
        let name = tfHeroName.text?.trimmingCharacters(in: .whitespacesAndNewlines)
        let poweRanking = tfPowerRanking.text?.trimmingCharacters(in: .whitespacesAndNewlines)

        if name!.isEmpty {
            tfHeroName.layer.borderColor = #colorLiteral(red: 0.8058760762, green: 0.2736578584, blue: 0.1300437152, alpha: 1)
        }

        if poweRanking!.isEmpty {
            tfPowerRanking.layer.borderColor = #colorLiteral(red: 0.8058760762, green: 0.2736578584, blue: 0.1300437152, alpha: 1)
        }

        //creating a statement
        var stmt: OpaquePointer?

        //the insert query
        let queryString = "INSERT INTO Heroes (name, powerrank) VALUES (?,?)"

        //preparing the query
        if sqlite3_prepare(db, queryString, -1, &stmt, nil)  != SQLITE_OK {

            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error preparing insert: \(errmsg)")
            return

        }

        //binding the parameters

        if sqlite3_bind_text(stmt, 1, name, -1, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding name: \(errmsg)")
            return
        }

        if sqlite3_bind_int(stmt, 2, (poweRanking! as NSString).intValue) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db))
            print("failure binding name: \(errmsg)")
        }

        //executing the query to insert values
        if sqlite3_step(stmt) != SQLITE_DONE {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding name: \(errmsg)")

        }

        //emptying the textfields
        tfHeroName.text = ""
        tfPowerRanking.text = ""


    }

    //MARK: Read Operation
    func readValues(){
        heroList.removeAll()

        let queryString = "SELECT * FROM Heroes"

        var stmt:OpaquePointer?

        if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error preparing insert: \(errmsg)")
            return
        }

        while(sqlite3_step(stmt) == SQLITE_ROW){
            let id = sqlite3_column_int(stmt, 0)
            let name = String(cString: sqlite3_column_text(stmt, 1))
            let powerrank = sqlite3_column_int(stmt, 2)

            heroList.append(Hero(id: Int(id), name: String(describing: name), powerRanking: Int(powerrank)))
        }

        self.tableView.reloadData()
        self.refreshControl.endRefreshing()
    }

    //MARK: Delete Operation
    func deleteItemFromList(itemId: Int32){

        let deleteStatementStirng = "DELETE FROM Heroes WHERE id = ?;"
        var deleteStatement: OpaquePointer? = nil

        if sqlite3_prepare(db, deleteStatementStirng, -1, &deleteStatement, nil) == SQLITE_OK {

            sqlite3_bind_int(deleteStatement, 1, itemId)

            if sqlite3_step(deleteStatement) == SQLITE_DONE {
                print("Successfully deleted row.")
            } else {
                print("Could not delete row.")
            }
        } else {
            print("DELETE statement could not be prepared")
        }

        sqlite3_finalize(deleteStatement)
        print("delete")
    }


    @objc private func refreshListData(_ sender: Any) {
        readValues()
    }

}

extension ViewController : UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return heroList.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell")
        let hero: Hero
        hero = heroList[indexPath.row]
        cell.textLabel?.text = hero.name
        return cell
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == UITableViewCell.EditingStyle.delete {
            heroList.remove(at: indexPath.row)
            deleteItemFromList(itemId: Int32(heroList[indexPath.row].powerRanking))
            tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
            tableView.reloadData()
        }

    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

}


class Hero {

    var id: Int
    var name: String?
    var powerRanking: Int

    init(id: Int, name: String?, powerRanking: Int){
        self.id = id
        self.name = name
        self.powerRanking = powerRanking
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM