1. 程式人生 > >讓sqlite支援uint64

讓sqlite支援uint64

問題

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的。

如果還有問題,加扣扣群聊吧。