SQLite Insert is not working properly in swift

2.7k views Asked by At

I am trying to insert data from array into my table. If the insert is done I think, its suppose to print it in the console, but it is not. So I tried db.trace(println) and it shows me

SELECT * FROM "formatedData1"

My createDatabase function:

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

Then I tried to run queries on the table to see if the data exists.

1st query:

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

And when I print it I get

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

2nd Query

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

    println(query)

And when I print it I get

"formatedData1"

3rd Query I wanted to print all rows only from two columns.

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

And It prints

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>

Sorry for long question but any help would be highly appreciated.

1

There are 1 answers

7
Eric Aya On BEST ANSWER

SQLite.swift doesn't print the insert results to the console by itself, you have to do something like this:

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

Then you can check id and statement and print the results to the console:

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

To access the row contents you need to use the types defined in the db, not literals:

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

Here self.name is one of the types created by the class containing createDatabase(), and corresponds to one of your columns.

EDIT:

You can access the content of a Row either by subscripting it (data[name], where name is of type Expression) or by its get method (data.get(name)).

To answer your comment: if you do data[42], it means to get the 42nd Row, not column. With this Row, you can then get your column content by using an Expression like I just explained.

Note that in Xcode, with ALT+CLICK you can see the type of any variable, it can help you while following your data flow.