2016-10-18 7 views
0

私はContactCardアプリを作成していますが、データベースに書き込む際にバグがあります。 私の書き込み方法:Swift 3 sqlite bug

enter image description here

一つの値が正しいか、それは、「日付」の値です:

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

私はwriteメソッドの後に読んでいる場合は、この出力されます。他の値はすべて正しくありません。誰かアイデア?

私のデータベースに標準のレコードが1つあり、正常に動作しています。

読み取り方法は:

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

答えて

1

sqlite3_bind_text()の第五のパラメータはnilあってはなりません。 よく分からない限り、SQLITE_TRANSIENTを使用してください。

+0

例がありますか? –

+0

または、自分のコードにコードを追加することはできますか?私はそれを感謝するでしょう:) –

+0

@AbusiveVids 'sqlite3_bind_text'への呼び出しで、' nil'を第5パラメータの 'SQLITE_TRANSIENT'に置き換えるだけです。 – rmaddy