这是我的问题:我有这个葡萄酒应用程序,它在一个漂亮的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应用程序。
我做错了什么?
答案 0 :(得分:0)
语法正确,可能您要检查是否:
sharedInstance.database!.open()
如果您在项目中加入FMDatabaseAdditionsVariadic.swift
和FMDatabaseVariadic.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
失败,因此首先尝试使用executeQuery
或executeStatments
来解决问题。
如果它不起作用,我认为在打开数据库后执行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)")
}