Abusive Vids
Abusive Vids

Reputation: 451

Swift 3 sqlite bug

I am creating a ContactCard app and I have a bug with writing to the database. My write method:

func create(contact: Contact) {

    let query = "INSERT INTO contact (Voornaam, Achternaam, Telefoonnummer, Email, Adres, Huisnummer, Toevoeging, Woonplaats, Postcode, Geboortedatum, Afbeelding) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
    var statement : OpaquePointer? = nil

    let jpegCompressionQuality: CGFloat = 0.9 // Set this to whatever suits your purpose

    if let base64String = UIImageJPEGRepresentation((contact.image), jpegCompressionQuality)?.base64EncodedString(){
        if sqlite3_prepare(db, query, -1, &statement, nil) == SQLITE_OK {
            sqlite3_bind_text(statement, 1, contact.firstName, -1, nil);
            sqlite3_bind_text(statement, 2, contact.lastName, -1, nil);
            sqlite3_bind_text(statement, 3, contact.phone, -1, nil);
            sqlite3_bind_text(statement, 4, contact.email, -1, nil);
            sqlite3_bind_text(statement, 5, contact.street, -1, nil);
            sqlite3_bind_text(statement, 6, contact.houseNumber, -1, nil);
            sqlite3_bind_text(statement, 7, contact.toevoeging, -1, nil);
            sqlite3_bind_text(statement, 8, contact.city, -1, nil);
            sqlite3_bind_text(statement, 9, contact.zip, -1, nil);
            sqlite3_bind_text(statement, 10, contact.date, -1, nil);
            sqlite3_bind_text(statement, 11, base64String, -1, nil);

            contacten.append(contact)

            if sqlite3_step(statement) != SQLITE_DONE {
                print("Error inserting row")
            }
        } else {
            print("Error")
        }
    }

    sqlite3_reset(statement);
    sqlite3_finalize(statement);
}

If I read after the write method is this the output:

enter image description here

One value is correct and that is the "date" value. The other values are all incorrect. Someone a idea?

My reading method works because I have standard one record in my database and that works fine.

Reading method:

func read() {

    let query = "SELECT * FROM contact;"

    var statement : OpaquePointer? = nil
    if sqlite3_prepare_v2(db, query, -1, &statement, nil) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db))
        print("error query: \(errmsg)")
    }

    while sqlite3_step(statement) == SQLITE_ROW {
        let contact = Contact()

        contact.firstName = String(cString: sqlite3_column_text(statement, 0))
        contact.lastName = String(cString: sqlite3_column_text(statement, 1))
        contact.phone = String(cString: sqlite3_column_text(statement, 2))
        contact.email = String(cString: sqlite3_column_text(statement, 3))
        contact.street = String(cString: sqlite3_column_text(statement, 4))
        contact.houseNumber = String(cString: sqlite3_column_text(statement, 5))
        contact.toevoeging = String(cString: sqlite3_column_text(statement, 6))
        contact.city = String(cString: sqlite3_column_text(statement, 7))
        contact.zip = String(cString: sqlite3_column_text(statement, 8))
        contact.date = String(cString: sqlite3_column_text(statement, 9))
        let imageData = NSData(base64Encoded: String(cString: sqlite3_column_text(statement, 10)), options: .ignoreUnknownCharacters)

        if (imageData?.length)! > 0{
            contact.image = UIImage(data: imageData as! Data)!
        }
        contacten.append(contact)
    }
}

Upvotes: 0

Views: 327

Answers (1)

CL.
CL.

Reputation: 180290

The fifth parameter of sqlite3_bind_text() must not be nil. Unless you know better, use SQLITE_TRANSIENT.

Upvotes: 1

Related Questions