iOS Swift 插入 sqlite FMDB

iOS Swift insert into sqlite FMDB

这是我的问题:我有这个 wine 应用程序,它以漂亮的 table 视图向用户显示我的数据库内容。我可以使用 FMDB executeQuery 函数很容易地从中获取数据,但是每当我尝试向 SQLite 添加内容时 table,它就会失败。

这是我使用的代码。

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 应用程序。

我做错了什么?

在某些情况下 executeUpdate 它会失败,所以首先尝试使用 executeQueryexecuteStatments 来解决问题。

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

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

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

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

更新 以前的代码不适合在生产环境中使用,因为它受到 SQL 注入 Reference 的影响,在我看来,使用带有 iOS 的 FMDB 并且以前的代码可以使用。

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

  • 你事先打电话给sharedInstance.database!.open()
  • 你的table只有3列

如果您在项目中包含 FMDatabaseAdditionsVariadic.swiftFMDatabaseVariadic.swift,您可以这样调用 executeUpdate

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

注意 :- 在这里,我向您发送在 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=""
        }
    }
}
}

这应该有效:

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