SQLite在Swift中的插入操作无法正常工作

3

我将尝试把数组中的数据插入到我的表格中。如果插入成功,它应该会在控制台打印出来,但实际上并没有。所以我尝试了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个回答

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

为了访问行内容,您需要使用在数据库中定义的类型,而不是字面量:
let all = Array(data)
for row in all {
    let name = row[self.name]
    println(name)
}

这里的self.name是包含createDatabase()的类创建的类型之一,对应于您的一个列。
编辑:
您可以通过下标访问Row的内容(data[name],其中name的类型为Expression),也可以通过其get方法(data.get(name))访问。
回答您的评论:如果您执行data[42],它意味着获取第42个Row,而不是列。使用这个Row,您可以通过使用像我刚刚解释的Expression来获取您的列内容。
请注意,在Xcode中,使用ALT + CLICK可以查看任何变量的类型,这可以帮助您跟踪数据流程。

谢谢Eric!插入结果显示有东西被添加到行中。昨晚我找到了另一种方法!但是我正在尝试弄清楚如何查看我的行中的内容(实际数据)!我尝试了你的最后一段代码,使用了all和myRow,如果我输入大于7的任何内容,它会给我一个越界错误!我想这是因为我有8列。我实际上看到有26个不同的行项目被插入到表中,我想看到每列和行或根据我的查询在表中的实际数据! - Dereck
1
你已经接近成功了,看一下我的回答的最后一部分。你可以通过下标访问 Row 的内容(data[name],其中 nameExpression 类型),也可以使用它的 get 方法(data.get(name))。请注意,在 Xcode 中,使用 ALT+CLICK 可以查看任何变量的类型,这可以帮助你跟踪数据流。 - Eric Aya
回答您的评论:在我的例子中,data[42] 是为了获取第42行,而不是列。有了这个行,您可以使用像我刚刚解释的 Expression 来获取您的列内容。 - Eric Aya
谢谢Eric!我刚看到你编辑过的代码,如果我使用你的代码来打印一个自定义查询,比如选择类型为“Rum”的名称,我写了代码但是它没有打印任何东西! let query = data.select(name) .filter(type == "Rum") for row in query{ let name = row[self.name] let type = row[self.type] println(name) println(type) } - Dereck
将您的语句分解并进行调试:首先,执行 let query = data.select(name) 并检查其是否有内容。如果没有,请进行调试。如果有,请调试接下来的筛选器。如果一切正常,请在尝试使用行之前调试循环中的行。等等。只有 有调试数据的能力,我无法做到这一点... 我可以做的是解释和举例说明,这就是我尝试做的事情。 - Eric Aya
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接