Problem with UnsafePointer <Uint8> in SQLite project in Swift

We are embedding SQLite in iOS, in Swift, without using wrappers or an Objective-C bridge. Everything works fine, except when the query is executed and the result is retrieved. The problem is UnsafePointer<UInt8>, which returns from SQLite to Swift as follows:

var querySQL = "SELECT address, phone FROM CONTACTS WHERE NAME = 'myName'"
var cQuery = querySQL.cStringUsingEncoding(NSUTF8StringEncoding)
var statement: COpaquePointer = nil
if sqlite3_prepare_v2(contactsDB, cQuery!, -1, &statement, nil) == SQLITE_OK {
   if sqlite3_step(statement) == SQLITE_ROW {
   var address : UnsafePointer<UInt8> = sqlite3_column_text(statement, 0)
   var data = NSData(bytes: address, length: 10)
   var string = NSString(data: data, encoding: NSUTF8StringEncoding)
   println(string)

As you can see, we can convert the pointer to String if we know the length of the object (in this case 10)

To understand this problem, I have the following example

let pointerFromString: UnsafePointer<Int8> = "xyz".cStringUsingEncoding(NSUTF8StringEncoding)
let stringFromPointer = String.fromCString(anotherPointerFromString_Int8)                    println(stringFromPointer!)

Given what CCharis an alias Int8, I can convert a Stringto UnsafePointer<Int8>using .cStringUsingEncoding(), and then return to Stringusing.fromCString(<UnsafePointer_CChar>)

The problem is that my SQLite result is one UnsafePointer_UInt8that cannot be used with.fromCString()

: a UnsafePointer_UInt8 UnsafePointer_Int8

+3
1

:

let address = sqlite3_column_text(statement, 0)
let string = String.fromCString(UnsafePointer<CChar>(address))

Swift 3 (Xcode 8), Swift 3: UnsafePointer <UInt8 > :

let string = String(cString: sqlite3_column_text(statement, 0))
+17

Source: https://habr.com/ru/post/1654968/


All Articles