FMDB:NULL值被检索为空字符串

时间:2015-08-03 13:37:10

标签: ios swift sqlite fmdb

我正在使用下面的(简化)函数使用FMDB和Swift检索客户记录。当title列中的可选值为NULL时,返回的客户对象的标题成员为空字符串而不是nil,这会产生误导。 是否可以对其进行重写,以便将NULL值检索为nil - 理想情况下,不对空字符串进行测试并明确设置nil(如果该值实际上是一个空字符串)?

func getCustomerById(id: NSUUID) -> Customer? {

    let db = FMDatabase(path: dbPath as String)
    if db.open() {
        let queryStatement = "SELECT * FROM Customers WHERE id = ?"
        let result = db.executeQuery(queryStatement, withArgumentsInArray: [id.UUIDString])

        while result.next() {
            var customer = Customer();
            customer.id = NSUUID(UUIDString: result.stringForColumn("customerId"))
            customer.firstName = result.stringForColumn("firstName")
            customer.lastName = result.stringForColumn("lastName")
            customer.title = result.stringForColumn("title")
            return customer
        }
    }
    else {
        println("Error: \(db.lastErrorMessage())")
    }
    return nil
}

1 个答案:

答案 0 :(得分:1)

NULL值将返回nil

db.executeUpdate("create table foo (bar text)", withArgumentsInArray: nil)
db.executeUpdate("insert into foo (bar) values (?)", withArgumentsInArray: ["baz"])
db.executeUpdate("insert into foo (bar) values (?)", withArgumentsInArray: [NSNull()])

if let rs = db.executeQuery("select * from foo", withArgumentsInArray: nil) {
    while rs.next() {
        if let string = rs.stringForColumn("bar") {
            println("bar = \(string)")
        } else {
            println("bar is null")
        }
    }
}

输出:

  

bar = baz左栏为空

您可能想要仔细检查值的插入方式。具体来说,是否使用NSNull添加了空值?或者也许在外部工具中打开数据库,并验证列是否与您预期的一样NULL