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
它会失败,所以首先尝试使用 executeQuery
或 executeStatments
来解决问题。
如果它不起作用,我认为在打开数据库后执行 sql 语句的正确方法是:
executeUpdate("INSERT INTO wine VALUES ('\(id)', '\(name)', '\(wineType)')")
并在语句执行成功后关闭数据库。您在数据库中的 ID 类型是什么?它是自动递增的吗?
您在控制台中遇到什么错误?尝试使用断点,看看发生了什么。
更新
以前的代码不适合在生产环境中使用,因为它受到 SQL 注入 Reference 的影响,在我看来,使用带有 iOS 的 FMDB 并且以前的代码可以使用。
语法正确,您可能需要检查是否:
- 你事先打电话给
sharedInstance.database!.open()
- 你的table只有3列
如果您在项目中包含 FMDatabaseAdditionsVariadic.swift
和 FMDatabaseVariadic.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)")
}
这是我的问题:我有这个 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
它会失败,所以首先尝试使用 executeQuery
或 executeStatments
来解决问题。
如果它不起作用,我认为在打开数据库后执行 sql 语句的正确方法是:
executeUpdate("INSERT INTO wine VALUES ('\(id)', '\(name)', '\(wineType)')")
并在语句执行成功后关闭数据库。您在数据库中的 ID 类型是什么?它是自动递增的吗?
您在控制台中遇到什么错误?尝试使用断点,看看发生了什么。
更新 以前的代码不适合在生产环境中使用,因为它受到 SQL 注入 Reference 的影响,在我看来,使用带有 iOS 的 FMDB 并且以前的代码可以使用。
语法正确,您可能需要检查是否:
- 你事先打电话给
sharedInstance.database!.open()
- 你的table只有3列
如果您在项目中包含 FMDatabaseAdditionsVariadic.swift
和 FMDatabaseVariadic.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)")
}