iOS Swift插入sqlite FMDB

时间:2016-04-02 18:40:10

标签: ios swift sqlite fmdb

这是我的问题:我有这个葡萄酒应用程序,它在一个漂亮的tableview中向用户显示我的数据库的内容。我可以使用FMDB executeQuery函数轻松地从中获取数据,但每当我尝试向SQLite表添加内容时,它就会失败。

这是我使用的代码。

do
 {
     try sharedInstance.database!.executeUpdate("INSERT INTO wine VALUES (?, ?, ?)", values: [id, name, wineType])
 }
 catch
 {
     print("error \(error)")
 }

我尝试将所有内容放在一个字符串中,然后将其作为第一个参数发送,并将nil作为第二个参数,并且也失败了。此语法来自Data Sanitisation section in the FMDB README from github

我发现了一些类似的案例,但答案是Objective-C。请注意,我是iOS新手,我对Objective-C一无所知,这是我的第一个Swift应用程序。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

语法正确,可能您要检查是否:

  • 您事先致电sharedInstance.database!.open()
  • 您的表格仅包含3列

如果您在项目中加入FMDatabaseAdditionsVariadic.swiftFMDatabaseVariadic.swift,则可以这样调用executeUpdate

do {
    try sharedInstance.database!.executeUpdate("INSERT INTO wine VALUES (?, ?, ?)", id, name, wineType)
} catch {
    print("error \(error)")
}

答案 1 :(得分:0)

注意: - 我在swift中使用FMDB向您发送在数据库中插入记录的代码。

import UIKit

class FMDBDatabaseSignUpVC: UIViewController {

@IBOutlet weak var txtFirstNameOutlet: UITextField!
@IBOutlet weak var txtLastNameOutlet: UITextField!
@IBOutlet weak var txtEMailIDOutlet: UITextField!
@IBOutlet weak var txtPasswordOutlet: UITextField!

var databasePath = NSString()
override func viewDidLoad() {
    super.viewDidLoad()

    let filemgr = NSFileManager.defaultManager()
    let dirPaths =
        NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
                                            .UserDomainMask, true).first as String!

    databasePath = (dirPaths as NSString).stringByAppendingPathComponent("swiftDemo.db")

    if !filemgr.fileExistsAtPath(databasePath as String)  {
        let contactDB = FMDatabase (path: databasePath as String)
        if contactDB == nil {
            print(contactDB.lastErrorMessage())
        }
    }
    // Do any additional setup after loading the view.
}

@IBAction func btnSaveAction(sender: UIButton) {

    let contactDB = FMDatabase (path: databasePath as String)
    if contactDB.open() {
        let InsertQry = "insert into userInfo (userFirstName, userLastName,userEmailID,userPassword) values ('\(txtFirstNameOutlet.text!)','\(txtLastNameOutlet.text!)','\(txtEMailIDOutlet.text!)','\(txtPasswordOutlet.text!)')"
        let result = contactDB.executeUpdate(InsertQry, withArgumentsInArray: nil)
        if !result {
            print(contactDB.lastErrorMessage())
        }
        else
        {
            print("Success")
            txtFirstNameOutlet.text=""
            txtLastNameOutlet.text=""
            txtEMailIDOutlet.text=""
            txtPasswordOutlet.text=""
        }
    }
}
}

答案 2 :(得分:-1)

在某些情况下executeUpdate失败,因此首先尝试使用executeQueryexecuteStatments来解决问题。

如果它不起作用,我认为在打开数据库后执行sql语句的正确方法是:

executeUpdate("INSERT INTO wine VALUES ('\(id)', '\(name)', '\(wineType)')")

语句成功执行后关闭数据库。您在数据库中的ID类型是什么?它是自动增量吗?

您在控制台中遇到了什么错误?尝试使用断点,看看发生了什么。

<强>更新 之前的代码不适合在生产环境中使用,因为它受SQL注入Reference的限制,在我看来使用FMDB和iOS,之前的代码可以使用。

答案 3 :(得分:-1)

这应该有效:

    do
 {
     try sharedInstance.database!.executeUpdate("INSERT INTO wine(id, name, wineType) VALUES (?, ?, ?)", values: [id, name, wineType])
 }
 catch
 {
     print("error \(error)")
 }