SQLite Insert 在 swift 中无法正常工作

SQLite Insert is not working properly in swift

我正在尝试将数组中的数据插入我的 table。如果我认为插入完成,它应该在控制台中打印它,但事实并非如此。所以我尝试了 db.trace(println) 它显示了

SELECT * FROM "formatedData1"

我的 createDatabase 函数:

    func createDatabase(){
        var data = db["formatedData1"]

        db.create(table: data, ifNotExists: true){ d in
            d.column(type, primaryKey: true)
            d.column(ada)
            d.column(code)
            d.column(name)
            d.column(proof)
            d.column(size)
            d.column(case_size)
            d.column(price)
        }

        for var i = 0; i < self.dataArrayMut.count; ++i{
            data.insert(type <- (self.dataArrayMut[i].valueForKey("Type") as! String), ada <- (self.dataArrayMut[i].valueForKey("ADA") as! String), code <- (self.dataArrayMut[i].valueForKey("Code") as! String), name <- (self.dataArrayMut[i].valueForKey("Name") as! String), proof <- (self.dataArrayMut[i].valueForKey("Proof") as! String), size <- (self.dataArrayMut[i].valueForKey("Size") as! String), case_size <- (self.dataArrayMut[i].valueForKey("CaseSize") as! String), price <- (self.dataArrayMut[i].valueForKey("Price") as! String))
        }

        db.trace(println)
    }

然后我尝试在table上运行查询数据是否存在。

第一个查询:

//Select * From data
let all = Array(data)
println(all.description)

当我打印它时,我得到

[SQLite.Row, SQLite.Row, SQLite.Row, SQLite.Row, SQLite.Row, SQLite.Row, SQLite.Row, SQLite.Row]

第二次查询

    //Select name From data where type = rum
    let query = data.select(name)
                    .filter(type == "Rum")

    println(query)

当我打印它时,我得到

"formatedData1"

第三次查询 我只想打印两列中的所有行。

    for datas in data.select(type, name){
        println("type: \(data[type]), name: \(data[name])")
    }

并打印

SELECT "Type", "Name" FROM "formatedData1"
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>
type: SQLite.Expression<Swift.String>, name: SQLite.Expression<Swift.String>

抱歉,问题很长,但我们将不胜感激。

SQLite.swift 不会自行将 insert 结果打印到控制台,您必须执行以下操作:

let (id, statement) = data.insert(type <- (self.dataArrayMut[i].valueForKey("Type") as! String))

然后你可以检查idstatement并将结果打印到控制台:

if let dbRowID = id {
    println("New entry: \(dbRowID)")
} else if statement.failed {
    println("Row insertion failed because \(statement.reason!)")
}

要访问行内容,您需要使用数据库中定义的类型,而不是文字:

let all = Array(data)
for row in all {
    let name = row[self.name]
    println(name)
}

这里的self.name是包含createDatabase()的class创建的类型之一,对应你的其中一个列。

编辑:

您可以通过下标(data[name],其中 name 的类型为 Expression)或通过其获取方法(data.get(name)).

回答您的评论:如果您这样做 data[42],则意味着获得第 42 个 Row,而不是列。有了这个 Row,您就可以像我刚才解释的那样使用 Expression 来获取您的专栏内容。

请注意,在Xcode中,使用 ALT+CLICK 可以看到任何变量的类型,它可以帮助您跟踪数据流。