swift - 如何从 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()
}
}
解决方案
从您用于构建表格视图的数据源中删除该项目,因为我可以看到您没有删除它。
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)
}
}
}
推荐阅读
- anaconda - Spyder 5.0.3 仍然显示缺少依赖项
- linux - 我们如何检查我们的邮件服务以及如何阻止来自 linux 服务器的外发电子邮件
- blpapi - 如何使用 pip(不是 conda)下载 blpapi 3.13.1
- javascript - 限制 URL 末尾的正斜杠
- r - 函数 AUC 包 Desctools:如何延长曲线
- flutter - 如何在运行 --android-licenses 后更正此错误“错误:无法找到或加载主类”
- python - 为什么python中的递归函数会出现内存错误?
- javascript - 根据申请表中选择的id更改要填写的字段(活动表保存所选项目具有的活动字段)
- google-apps-script - 在谷歌表格中的 60 天滚动窗口中删除重复项
- mysql - RDBMS Resource Usage when Using PrestoDB