将 FMDB SQLite 结果附加到 Swift 数组

Append FMDB SQLite results to Swift array

我正在尝试将 FMDB SQLite 查询的结果附加到 Swift 数组。我在 XCode 中遇到的错误是“选项类型 'String?' 的值未展开。”

在 while 循环中换掉下面的行,FMDB 结果可以打印到控制台 OK,所以没有问题。

println(results_lab_test?.stringForColumn("lab_test"))

XCode 的新手,请善待...

  import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var tests_label: UILabel!

    var databasePath = NSString()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        var arrayData:[String] = []



        let filemgr = NSFileManager.defaultManager()

        let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

        let docsDir = dirPaths[0] as! String

        databasePath = docsDir.stringByAppendingPathComponent("vmd_db.db")

        let myDatabase = FMDatabase(path: databasePath as String)

        if myDatabase.open(){

            let query_lab_test = "SELECT lab_test FROM lab_test"

            let results_lab_test:FMResultSet? = myDatabase.executeQuery(query_lab_test, withArgumentsInArray: nil)

            while results_lab_test?.next() == true {
                if let resultString = results_lab_test?.stringForColumn("lab_test"){
                arrayData.append(resultString)
                    var multiLineString = join("\n", arrayData)
                    tests_label.text = multiLineString
                    tests_label.numberOfLines = 0
                    tests_label.lineBreakMode = NSLineBreakMode.ByWordWrapping
                    tests_label.sizeToFit()

            }

        }
    }
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

工作代码感谢@skypecakes:

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var tests_label: UILabel!

    var databasePath = NSString()

    override func viewDidLoad() {
        super.viewDidLoad()

        let filemgr = NSFileManager.defaultManager()

        let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

        let docsDir = dirPaths[0] as! String

        databasePath = docsDir.stringByAppendingPathComponent("vmd_db.db")

        let myDatabase = FMDatabase(path: databasePath as String)

        if myDatabase.open(){

            var arrayData:[String] = []

            let query_lab_test = "SELECT lab_test FROM lab_test"

            let results_lab_test:FMResultSet? = myDatabase.executeQuery(query_lab_test, withArgumentsInArray: nil)

            while results_lab_test?.next() == true {

                if let resultString = results_lab_test?.stringForColumn("lab_test"){

                arrayData.append(resultString)

            }
        }
            println(arrayData)
            myDatabase.close()
    }
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

好像 results_lab_test?.stringForColumn("lab_test") returns 一个字符串?,这是一个可选的。您的数组被定义为 "String" 项目的数组,因此您不能将 "String?" 放入其中。 试试这个:

if let resultString = results_lab_test?.stringForColumn("lab_test")
    arrayData.append(resultString)

请注意,一般来说,最好用 "if let" 解开所有可选值,而不是假设它们已填充。所以在任何有问号的地方(例如 results_lab_test?.stringForColumn),你都可以使用 "if let"。

如果您将 XCode 7 与 Swift 2.0 一起使用,这将是 "guard let" 语句的一个很好的例子,它提供了一种方便的语法来中止您的代码,如果可选 returns 空值:

guard let queryResults = results_lab_test else return
while queryResults.next() == true {
if let resultString = queryResults.stringForColumn("lab_test")
        arrayData.append(resultString)
}

这个测试对我有效(table 有 2 行,打印数组打印 2 行),以防对您有帮助:

import UIKit
import FMDB

class ViewController: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        if let myDatabase = makeSqlDB()
        {
            var arrayData:[String] = []
            let query_lab_test = "SELECT lab_test FROM lab_test"

            let results_lab_test:FMResultSet? = myDatabase.executeQuery(query_lab_test, withArgumentsInArray: nil)

            while results_lab_test?.next() == true
            {
                if let resultString = results_lab_test?.stringForColumn("lab_test")
                {
                    arrayData.append(resultString)
                }
            }

            println(arrayData)
            myDatabase.close()
        }
    }


    private func makeSqlDB()->FMDatabase?
    {
        let database = FMDatabase(path: String())

        if !database.open() {
            println("Unable to open database")
            return nil
        }

        if !database.executeUpdate("create table lab_test(lab_test text)", withArgumentsInArray: nil) {
            println("create table failed: \(database.lastErrorMessage())")
        }

        if !database.executeUpdate("insert into lab_test (lab_test) values (?)", withArgumentsInArray: ["test1"]) {
            println("insert 1 table failed: \(database.lastErrorMessage())")
        }

        if !database.executeUpdate("insert into lab_test (lab_test) values (?)", withArgumentsInArray: ["test2"]) {
            println("insert 2 table failed: \(database.lastErrorMessage())")
        }

        return database
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}