如何使用 Swift 从 tableview 和 sqlite3 中删除
Posted
技术标签:
【中文标题】如何使用 Swift 从 tableview 和 sqlite3 中删除【英文标题】:How to delete from tableview as well as sqlite3 using Swift 【发布时间】:2019-03-30 08:47:50 【问题描述】:我是 swift 和 sqlite3 的新手,我需要有关如何从 tableview 和 sql db 中删除的帮助。
我尝试使用 reloadData() 但它不起作用。我尝试使用tableView.deleteRows(at: [indexPath], with: .fade)
进行删除,但由于在此之前运行了一个 sql 删除语句,我收到了错误消息。使用下面提供的此代码,我成功地能够从数据库中删除该项目,但它不会刷新 tableview。我临时修复它的方法是在成功删除项目后执行前一个屏幕的切换,当返回到 tableviewcontroller 时它将被删除。
import UIKit
class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate
let mainDelegate = UIApplication.shared.delegate as! AppDelegate
@IBOutlet var tableView: UITableView!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let tableCell = tableView.dequeueReusableCell(withIdentifier: "cell") as? SiteCell ?? SiteCell(style: .default, reuseIdentifier: "cell")
let rowNum = indexPath.row
tableCell.primaryLabel.text = mainDelegate.people[rowNum].name
tableCell.secondaryLabel.text = mainDelegate.people[rowNum].email
tableCell.myImageView.image = UIImage(named: mainDelegate.people[rowNum].avatar!)
tableCell.accessoryType = .disclosureIndicator
return tableCell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return mainDelegate.people.count
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 70
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let rowNum = indexPath.row
let details : String! = "Address: \(mainDelegate.people[rowNum].address!) \nPhone Num: \(mainDelegate.people[rowNum].phonenum!) \nEmail: \(mainDelegate.people[rowNum].email!) \nAge: \(mainDelegate.people[rowNum].age!) \nGender: \(mainDelegate.people[rowNum].gender!) \nDate of birth: \(mainDelegate.people[rowNum].dob!)"
let alertController = UIAlertController(title: mainDelegate.people[rowNum].name, message: details, preferredStyle: .alert
)
let cancelAction = UIAlertAction(title: "ok", style: .cancel, handler: nil)
print("TESTING ROW: \(mainDelegate.people[rowNum].id!)")
alertController.addAction(cancelAction)
present(alertController, animated: true)
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
var rowNum: Int = indexPath.row
if editingStyle == .delete
print("Testing delete \(mainDelegate.people[rowNum].id!)")
print("\(indexPath.row)")
mainDelegate.removeFromDatabase(id: mainDelegate.people[rowNum].id!)
print("\(indexPath)")
// tableView.deleteRows(at: [indexPath], with: .fade)
DispatchQueue.main.async
self.tableView.reloadData()
// self.performSegue(withIdentifier: "DataToInfo", sender: self)
// let mainDelegate = UIApplication.shared.delegate as! AppDelegate
// mainDelegate.removeFromDatabase(person: mainDelegate.people[indexPath.row])
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
mainDelegate.readDataFromDatabase()
removeFromDatabase 方法
func removeFromDatabase(id : Int)
var db : OpaquePointer? = nil
if sqlite3_open(self.databasePath, &db) == SQLITE_OK
print("Successfully opened connection to database at \(self.databasePath)")
var deleteStatement : OpaquePointer? = nil
let deleteStatementString : String = "delete from entries where id=\(id)"
if sqlite3_prepare_v2(db, deleteStatementString, -1, &deleteStatement, nil) == SQLITE_OK
if sqlite3_step(deleteStatement) == SQLITE_DONE
print("Deleted")
else
print("Failed")
else
print("Couldn't prepare")
sqlite3_finalize(deleteStatement)
sqlite3_close(db)
我试图从 tableview 和数据库中删除它。有一次我试图
mainDelegate.people.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
然后运行 removeFromDatabase,但它给了我一个错误。
【问题讨论】:
你应该在重新加载 tableview 之前更新你的数据源 @AntonNovoselov 我该怎么做呢?有没有一种方法可以保持 .fade 的动画风格,同时从我的数据库中删除它? 不知道你的数据源是怎么实现的,从数据库中删除是怎么实现的。 cellForRow 方法 - 在哪里显示对象? @AntonNovoselov 我已经更新了帖子以包含整个 tableviewcontroller 以及 removefromdatabase 方法 【参考方案1】:您应该更新您的数据源。尝试像这样重构您的 commitEditing:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
var rowNum: Int = indexPath.row
if editingStyle == .delete
print("Testing delete \(mainDelegate.people[rowNum].id!)")
print("\(indexPath.row)")
mainDelegate.removeFromDatabase(id: mainDelegate.people[rowNum].id!)
print("\(indexPath)")
mainDelegate.readDataFromDatabase()
tableView.deleteRows(at: [indexPath], with: .fade)
【讨论】:
以上是关于如何使用 Swift 从 tableview 和 sqlite3 中删除的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SWrevaelviewController swift 3 将数据从 tableview 的特定行传递到另一个视图控制器
如何使用 Swift 从 tableview 单元格中获取数据而不显示在标签上?
Swift iOS - 如何在按下单元格之前从 TableView 的所有 IndexPath 中获取数据
如何在 Swift 3 中使用 JSON 填充 TableView