Как удалить строку просмотра таблицы в SQLite Swift 4 - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу знать, как удалить строку из базы данных 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()

}
}

1 Ответ

0 голосов
/ 12 ноября 2018

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-запрос сделает всю работу за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...