ios - swift 从此代码中删除可选项

标签 ios swift2

下面的代码运行良好,但 address.text 和 phone.text 的值输出为可选。试图通过放置来打开它! (地址.text = results.stringForColumn(“地址”)! phone.text = results.stringForColumn("phone")!),但它没有帮助。

@IBAction func findContact(sender: AnyObject) {
    let contactDB = FMDatabase(path: databasePath as String)

    if contactDB.open() {
        let querySQL = "SELECT address, phone FROM CONTACTS WHERE name = '\(name.text)'"

        if let results:FMResultSet = contactDB.executeQuery(querySQL,
            withArgumentsInArray: nil) {

                if results.next() == true {
                    address.text = results.stringForColumn("address")
                    phone.text = results.stringForColumn("phone")
                    status.text = "Record Found"
                } else {
                    status.text = "Record not found"
                    address.text = ""
                    phone.text = ""
                }
                contactDB.close()
        } else {
            print("Error: \(contactDB.lastErrorMessage())")
        }
    }
}

有什么建议吗?

最佳答案

问题是 UITextFieldtext 方法是可选的,所以你的 SQL 可能最终看起来像这样:

SELECT address, phone FROM CONTACTS WHERE name = 'Optional("foo")'

那肯定是不对的。在尝试使用它之前,您需要解包 name.text

但是您根本不应该像那样尝试手动构建 SQL。如果 name.text 包含 ' 字符(例如 Liam O'Flaherety),您就会遇到问题。在 SQL 中使用 ? 占位符(不应与 Swift 中的 ? 混淆)。

然后在 withArgumentsInArray 中解包 name.text:

@IBAction func findContact(sender: AnyObject) {
    let contactDB = FMDatabase(path: databasePath as String)
    if contactDB.open() {
        let querySQL = "SELECT address, phone FROM CONTACTS WHERE name = ?"

        if let results = contactDB.executeQuery(querySQL, withArgumentsInArray: [name.text!]) {
            if results.next() {
                address.text = results.stringForColumn("address")
                phone.text = results.stringForColumn("phone")
                status.text = "Record Found"
            } else {
                status.text = "Record not found"
                address.text = ""
                phone.text = ""
            }
        } else {
            print("Error: \(contactDB.lastErrorMessage())")
        }
        contactDB.close()    // note, this should be outside the `if` for `executeQuery`
    }
}

或者,如果使用 Swift 2,您可以:

@IBAction func findContact(sender: AnyObject) {
    let contactDB = FMDatabase(path: databasePath as String)
    if contactDB.open() {
        do {
            defer { contactDB.close() }

            let querySQL = "SELECT address, phone FROM CONTACTS WHERE name = ?"

            let results = try contactDB.executeQuery(querySQL, values: [name.text!])
            if results.next() {
                address.text = results.stringForColumn("address")
                phone.text = results.stringForColumn("phone")
                status.text = "Record Found"
            } else {
                status.text = "Record not found"
                address.text = ""
                phone.text = ""
            }
        } catch let error as NSError {
            print("Error: \(error.localizedDescription)")
        }
    }
}

关于ios - swift 从此代码中删除可选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33988208/

相关文章:

javascript - 在 IOS 上单击按钮时,iframe 不滚动

swift - 使用 Show Segue 放松 Segue

ios - 在 Swift 中模拟单例进行单元测试时遇到问题

ios - 如何在 Xcode 7.2 中使用 UIWebViews 加载网站的 CSS 和 JS 文件?

ios - UICollectionView:将点击手势识别器添加到 collectionView super View

ios - 动态改变 objective-c 中单元格的高度

ios - Swift - 将项目添加到数组时解包可选值时意外发现 nil

Swift:总是在 inout 上复制?

ios - 类型 'UITouch' 的值没有成员 'locationInNode'

iphone - 如何查看一个类是否有属性?