首页 > 解决方案 > 如何从 Sqlite swift 中删除表视图行?

问题描述

我正在尝试从 sqlite 中删除行。我已经使用滑动方法从 sqlite 中删除项目,但它仍然无法正常工作....

我在 swipe 方法中调用了函数 deleteItem(),并且我还收到消息“已成功删除行”。但仍然没有删除行。下面是我可能尝试实现的试用代码。

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")
}

//删除项目sqlite

 func deleteItem(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")
    }


    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
    {
        let c : Int32 = Int32(indexPath.row)
        deleteItem(itemId: c)   
         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()

        }
        }

标签: swiftxcode

解决方案


从您用于构建表格视图的数据源中删除该项目,因为我可以看到您没有删除它。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {
            let c : Int32 = Int32(indexPath.row)
            deleteItem(itemId: c)   
            brainList.remove(at: indexPath.row)
            self.tableViewHeroes.deleteRows(at: [indexPath], with: .automatic)
        }
    }
}

推荐阅读