讓sqlite支援uint64
阿新 • • 發佈:2018-11-21
問題
sqlite的整數字段“INTEGER”,最大隻支援int64,並不支援uint64,有些情況下,如果要用uint64存資料,可能會導致數值溢位而丟失資料。
例如要儲存的值是0XFFFFFFFFFFFFFFFF,但是呼叫sqlite3_column_int64讀取出來後會是0x7FFFFFFFFFFFFFFF。
這是因為sqlite內部做了限制。
解決辦法
以下步驟:
1.寫入時候採用blob的方式
在寫入記錄值的時候,採用填寫BLOB的方式把uint64值寫入資料庫,而不是通過sql語句中字串描述的方式來寫入。
例如不要採用下面的方式:“insert into tabletest VALUE(6895782558888888)”,這種方式寫入後,sqlite系統後期讀取的時候會當作普通整數而做轉換和限制處理,導致uint64的值可能會被砍掉。
2.讀取的時候以blob的方式
參考我封裝的一個巨集:
#define sqlite3_column_raw_uint64(stmt, columnindex) *(uint64 *)(sqlite3_column_blob((sqlite3_stmt *)(stmt),(columnindex)))
使用的時候這樣就行:
sqlite3_column_raw_uint64(stmt, columnindex);
注意:相應的uint64欄位定義依然可以保持原先的“INTEGER”不變;
以上方法是針對sqlite的處理特點解決的,所以不管是android的java或者ios object-c或者swift,應該都ok的。
如果還有問題,加扣扣群聊吧。