首页 > swift2 新手一问 有关 sqlite3_step 出现error code =21 错误

swift2 新手一问 有关 sqlite3_step 出现error code =21 错误

这只是一个简单的 资料库update 不知道是我的资料库设置错误,还是如何,出现了这个讯息

error code =21 上网址了一下,21代表 SQLITE_MISUSE 21 / 不正确的库使用 | Library used incorrectly /

不知道那里有问题,这只是一个很简单的程式

class ViewController: UIViewController {

@IBOutlet weak var labelId: UILabel!
@IBOutlet weak var textName: UITextField!
@IBOutlet weak var textChinese: UITextField!
@IBOutlet weak var textMath: UITextField!
@IBOutlet weak var tableViewSqlite: UITableView!
@IBOutlet weak var buttonInsert: UIButton!
@IBOutlet weak var buttonWrite: UIButton!
struct stu {
    var id:Int32
    var name:String
    var chinese:Int32
    var math:Int32
    
    init(id:Int32, name:String, chinese:Int32, math:Int32) {
        self.id = id
        self.name = name
        self.chinese = chinese
        self.math = math
    }
}

var arrStu:Array<stu> = [] //存资料库的阵列
var db:COpaquePointer = nil
var statement:COpaquePointer = nil
var sql:NSString = "" //SQL指令
var currentStu = 0 //目前资料


override func viewDidLoad() {
    super.viewDidLoad()
    buttonToggle(true,writeAble: false)
    var fm:NSFileManager = NSFileManager()
    db = nil
    var src:String = NSBundle.mainBundle().pathForResource("student", ofType: "sqlite")!
    var dst:String = NSHomeDirectory() + "/Documents/student.sqlite"
    if !fm.fileExistsAtPath(dst){
        do{
            try!fm.copyItemAtPath(src, toPath: dst)
        }
        catch _ {
        
        }
        
    }
    
    if sqlite3_open(dst, &db) != SQLITE_OK {
        alertMsg("Error", msgStr: "cant open the db")
        exit(1)
    }
    
    sql="select * from class101"
    statement = nil
    if sqlite3_prepare_v2(db, sql.UTF8String, -1, &statement, nil) != SQLITE_OK {
        alertMsg("ERROR", msgStr: "read db faile")
        exit(1)
    }
    
    while sqlite3_step(statement) == SQLITE_ROW {
        var id = sqlite3_column_int(statement, 0)
        var temName = sqlite3_column_text(statement, 1)
        var name = String.fromCString(UnsafePointer<CChar>(temName))
        var chinese = sqlite3_column_int(statement, 2)
        var math = sqlite3_column_int(statement, 3)
        var student:stu = stu(id: id, name: name!, chinese: chinese, math: math)
        arrStu.append(student) //将资料列存入阵列
    }
    //sqlite3_finalize(statement)
    tableViewSqlite.reloadData()
    showSingle(0)
    
}

@IBAction func modeifyClick(sender: UIButton) {
    var alertModify:UIAlertView = UIAlertView()
    alertModify.title="更新"
    alertModify.message="确定要更新资料?"
    alertModify.delegate=self
    alertModify.addButtonWithTitle("确定");
    alertModify.addButtonWithTitle("取消");
    alertModify.show();
}

@IBAction func deleteClick(sender: UIButton) {
    if arrStu.count > 1 {
        var alertDelete:UIAlertView = UIAlertView()
        alertDelete.title="删除"
        alertDelete.message="确定删除资料?"
        alertDelete.delegate=self
        alertDelete.addButtonWithTitle("确定")
        alertDelete.addButtonWithTitle("取消")
        alertDelete.show()
    }
    else{
        self.alertMsg("ERROR", msgStr: "cant delete the data when data count =1")
    }
}
func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex:Int) {
    if alertView.title=="更新" {
        switch (buttonIndex) {
        case 0:
            var sql1="UPDATE clsss101 SET s_name'" + textName.text! + "',s_chinese='" + textChinese.text!
            var sql2="', s_math='" + textMath.text! + "' WHERE s_id=" + labelId.text!
            sql = sql1+sql2
            statement = nil
            sqlite3_prepare_v2(db, sql.UTF8String, -1, &statement, nil)
            //下面行印出error code=21
            //下面行印出error code=21
            //下面行印出error code=21
            //下面行印出error code=21
            print(sqlite3_step(statement))
            //*************下面这行错误******************
            //*************下面这行错误******************
            //*************下面这行错误******************
            //*************下面这行错误******************
            if sqlite3_step(statement) == SQLITE_DONE {
                alertMsg("Success",msgStr:"DB update success")
            }
            else{
                alertMsg("Error", msgStr: "Db update Fail")
            }
            arrStu[currentStu].name=textName.text!
            arrStu[currentStu].chinese=Int32(Int(textChinese.text!)!)
            arrStu[currentStu].math = Int32(Int(textMath.text!)!)
            tableViewSqlite.reloadData()
        default:
            break
        }
    }
    else if alertView.title == "删除" {
        switch(buttonIndex){
        case 0:
            sql = "DELETE FROM class101 WHERE id='"+labelId.text!+"'"
            statement = nil
            sqlite3_prepare_v2(db, sql.UTF8String, -1, &statement, nil)
            if sqlite3_step(statement) == SQLITE_DONE {
                alertMsg("SUCCESS", msgStr: "Delete data success")
            }
            else{
                alertMsg("Error", msgStr:"delete data faie")
            }
            arrStu.removeAtIndex(currentStu)
            tableViewSqlite.reloadData()
            if tableViewSqlite == arrStu.count {
                --currentStu
            }
            showSingle(currentStu)
        default:
            break
        }
        
        
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
func showSingle(n:Int) {
    labelId.text = "\(arrStu[n].id)"
    textName.text = arrStu[n].name
    textChinese.text = "\(arrStu[n].chinese)"
    textMath.text = "\(arrStu[n].math)"
}

func buttonToggle(insertAble:Bool, writeAble:Bool) -> Void {
    buttonInsert.enabled = insertAble
    buttonWrite.enabled = writeAble
}

func alertMsg(titleStr:String, msgStr:String) -> Void {
    let alertView:UIAlertView = UIAlertView(title: titleStr, message: msgStr, delegate: self, cancelButtonTitle: "确定")
    alertView.show()
}
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{
    return arrStu.count
}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell: UITableViewCell = tableView!.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath);
    cell.textLabel!.text = "姓名:\(arrStu[indexPath.row].name)"
    cell.detailTextLabel?.text = "国文:\(arrStu[indexPath.row].chinese)   数学:\(arrStu[indexPath.row].math)"
    return cell
}

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    buttonToggle(true, writeAble:false)
    currentStu = indexPath.row
    showSingle(currentStu)
}

}

【热门文章】
【热门文章】