SQLite Insert在swift中不起作用

时间:2015-06-09 18:24:04

标签: swift sqlite.swift

我正在尝试将数组中的数据插入到我的表中。如果插入完成,我想,它假设在控制台中打印它,但事实并非如此。所以我尝试了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)
    }

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

第一次查询:

//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>

很抱歉这个问题很长,但我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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!)")
}

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

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

此处self.name是包含createDatabase()的类创建的类型之一,并且对应于您的一个列。

编辑:

您可以通过下标(Rowdata[name]类型为name)或其get方法({{1}来访问Expression的内容}})。

要回答您的评论:如果您执行data.get(name),则表示获取第42个data[42],而不是列。使用此Row,您可以使用我刚刚解释过的Row来获取您的列内容。

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