ios - 每列都有最后一列值。 SQLITE数据库

标签 ios swift database sqlite

我对该行中的每一列都得到相同的输出。

我的输出应该是这样的

"jack 1 blast male"

但我喜欢

"male 1 male male"

每一列都有最后一列的值。 下面列出了我的整个代码。

请帮助我,我是 sqlite 的新手。

我不知道应该在哪里更改代码以使其正确,请帮忙。

import UIKit
import SQLite3

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var lab1: UILabel!

    var db: OpaquePointer?
    var heroList = [Hero]()

    @IBOutlet weak var tableViewHeroes: UITableView!


    @IBAction func buttonSave(_ sender: UIButton) {
        let name = "jack"
        let powerRanking = "1"
        let power = "blast"
        let gender = "Male"




        var stmt: OpaquePointer?

        let queryString = "INSERT INTO Heroes (name, powerrank, power, gender) 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_bind_text(stmt, 3, power, -1, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding name: \(errmsg)")
            return
        }

        if sqlite3_bind_text(stmt, 4, gender, -1, nil) != 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
        }



        readValues()

        print("Herro saved successfully")
    }


    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.id.description + (hero.name?.description)! + (hero.powerRanking.description) + (hero.power?.description)! + (hero.gender?.description)!

        return cell
    }


    func readValues(){
        heroList.removeAll()

        let queryString = "SELECT * FROM Heroes ORDER BY id DESC LIMIT 1;"

        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)

            let power = String(cString: sqlite3_column_text(stmt, 3))
            let gender = String(cString: sqlite3_column_text(stmt, 4))


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

        self.tableViewHeroes.reloadData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()


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


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

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

        readValues()
    }
}

最佳答案

通过对字符串进行编码即可解决问题

if sqlite3_bind_text(stmt, 2, (monthen as NSString).utf8String, -1, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding name: \(errmsg)")

            return
        }

关于ios - 每列都有最后一列值。 SQLITE数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54254451/

相关文章:

iOS 7 : UIAlertView created in UIActionSheet delegate function cannot auto rotate

ios - 在 UITableView 中的部分索引标题之间添加填充(或增加高度)

SQL - 按自定义 24 小时周期对结果进行分组

c# - 查看数据库中的数据与 EF 生成的不同

sql - 为什么引用 SQLite rowid 会导致外键不匹配?

ios - Swift youtube ios helper 全屏抛出异常

ios - 在 CocoaPods 0.39.0 上运行 pod update 时发出警告

objective-c - Swift 中 NSDictionary 函数的问题

ios - 如果 TextField 为空,则禁用按钮

swift - 稍后在 Xcode 中生成 .strings 文件