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))
然后你可以检查id
和statement
并将结果打印到控制台:
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 可以看到任何变量的类型,它可以帮助您跟踪数据流。
我正在尝试将数组中的数据插入我的 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))
然后你可以检查id
和statement
并将结果打印到控制台:
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 可以看到任何变量的类型,它可以帮助您跟踪数据流。