첫 번째 바인딩에서 런타임에 충돌하는 코드는 다음과 같습니다.
func update(time: Date) throws {
let sql = "UPDATE Entrys SET date = ? WHERE id = ?" //Questionable
guard let update = try db.prepareStatement(sql: sql) else { throw SQLiteError.prepare }
sqlite3_finalize(update)
let iso8601Time = ISO8601Time(date: time)
guard sqlite3_bind_text(update, 1, iso8601Time.concise(), -1, SQLITE_TRANSIENT) == SQLITE_OK else { throw SQLiteError.bind } //Throws error here
guard sqlite3_bind_int(update, 2, Int32(id)) == SQLITE_OK else { throw SQLiteError.bind }
guard sqlite3_step(update) == SQLITE_ROW else { throw SQLiteError.step }
}
ISO8601Time은 Text와 Swift 사이에서 변환하는 객체입니다 .Date는 내가 삽입하는 다른 코드에서 작동합니다.
문서가 나를 돕지 않습니다.
내 SQL 구문이 잘못되었을 수 있습니다. 온라인에서 신뢰할 수있는 예를 찾지 못했습니다.
조언하십시오.
=)
편집 1 :
터미널의 sqlite 편집기에서 다음 코드가 작동 함을 확인했습니다. 위의 형식과 비슷합니다.
Update Entrys SET date = "test" WHERE id = 1;
또한 sqlite3_bind_text 및 sqlite3_bind_int가 단위 테스트 및 통과 된 다른 함수에서 작동 함을 확인했습니다. 이 구문을 UPDATE로 전송하는 방법을 잘 모르겠으며 문서에는 지금까지 찾은 내용이 없습니다.
편집 2 :
다음은 작동하고 여러 매개 변수가 있고 문제 해결에 도움이 될 수있는 삽입에 대한 SQLite 구문을 보여줍니다.
func add(date: Date, confirmed: Bool, scale: Int, measurement: SQLMeasurement) throws -> SQLEntry {
let sql = "INSERT INTO Entrys (date, confirmed, scale, measurementID) VALUES (?,?,?,?);"
guard let insert = try? db.prepareStatement(sql: sql) else { fatalError() }
defer { sqlite3_finalize(insert) }
let iso8601Time = ISO8601Time(date: date)
guard sqlite3_bind_text(insert, 1, iso8601Time.concise(), -1, SQLITE_TRANSIENT) == SQLITE_OK else { throw SQLiteError.bind }
var bool: Int //FIXME: Vars are trouble
if confirmed { bool = 1 }
else { bool = 0 }
guard sqlite3_bind_int(insert, 2, Int32(bool)) == SQLITE_OK else { throw SQLiteError.bind }
guard sqlite3_bind_int(insert, 3, Int32(scale)) == SQLITE_OK else { throw SQLiteError.bind }
guard sqlite3_bind_int(insert, 4, Int32(measurement.id)) == SQLITE_OK else { throw SQLiteError.bind }
guard sqlite3_step(insert) == SQLITE_DONE else { throw SQLiteError.step }
let lastId = db.lastId()
return SQLEntry(id: lastId, db: db)
}
올바른 순서는 다음과 같습니다.
sqlite3_finalize(stmt)
).준비된 명령문을 작성하고 즉시 삭제하지만 여전히 액세스하여 충돌이 발생합니다.
선적 서류 비치:
sqlite3_finalize () 함수는 준비된 문을 삭제하기 위해 호출됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다