SharedPreferences如何支持Double類型的數據?

SharedPreferences是Android官方爲我們提供的一個非常簡單易用的本地持久化數據存儲工具,我們可以很輕鬆的利用它存儲一些常用的鍵值對。在App退出關閉後,其存儲的數據依然有效,很多不需要存儲複雜數據和大數據的應用,只靠SharedPreferences就能滿足數據本地存儲的需求了。

SharedPreferences可以支持的有5種數據類型,分別是:int、long、boolean、float、String,無論是用put還是get方法,其基本的數據類型只有這5種。細心的朋友會發現,咦,怎麼沒有double呢?

關於SharedPreferences爲何不支持double類型,我在Google上沒找到答案。當然了,作爲一個開發者,不知道這個理由也無所謂,但我們確實在很多時候需要在SharedPreferences裏面保存double類型的數據,那該怎麼辦呢?

方法一:直接保存成float型

大概這是頭腦轉的最快的那些人首先想到的吧,畢竟二者很相似,在實際應用的很多場景中確實可以互相替代。但是把double數據直接保存成float的顯然是錯誤的,首先這可能會丟失一部分精度,而且還可能會造成數據溢出。我一個小數點10多位的double,你給我用float保存,結果取值的時候就只剩下7位了,雖然大部分情況下不會造成嚴重後果,但這在本質上是錯誤的,即使真這麼做了,也只能說是一種妥協。

方法二:轉成String類型保存

比較機靈的人可能這麼想,我先用String.valueOf(double)把double數據轉成String進行保存,在取出來的時候再用Double. parseDouble(String)進行轉換不就行了?       這種做法還算是靠譜,至少在使用中不會出現溢出和損失精度之類的問題,但也不完美,因爲Double和String的互相轉換這2個方法是有一定的性能損耗的(當然還不至於產生ANR等問題)。那麼有沒有更好的辦法?

方法三:轉化爲raw long bits進行保存,取值的時候再轉化爲double    

Double類中有這樣一個方法:

 

1

    public static long doubleToRawLongBits(double value)

該方法返回根據IEEE754浮點“雙精度格式”位佈局,不是非數字(NaN)值,返回指定浮點值的表示。它包括以下要點:

  • 如果參數爲正無窮大,其結果是 0x7ff0000000000000L.
  • 如果參數爲負無窮大,其結果是 0xfff0000000000000L.
  • 如果參數爲NaN,那麼結果是長整型表示實際NaN值。doubleToLongBits方法不同,doubleToRawLongBits不垮所有的位模式NaN編碼爲一個單一的“規範”NaN值。

這樣一來,就可以完整的把double進行保存了。由於轉換後的數據跟原來的double數據長度一致,因爲完全不必擔心會有精度損失或者溢出的問題。通過Double.longBitsToDouble(long value)方法則可以得到原來的double數據。

所以,我們可以用如下2個方法,實現在SharedPreferences裏保存和獲取double數據了:

 

1

2

3

4

5

6

7

8

    static SharedPreferences.Editor putDouble(final SharedPreferences.Editor edit, final String key, final double value) {

        return edit.putLong(key, Double.doubleToRawLongBits(value));

    }

    static double getDouble(final SharedPreferences prefs, final String key, final double defaultValue) {

        if ( !prefs.contains(key))

            return defaultValue;

        return Double.longBitsToDouble(prefs.getLong(key, 0));

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章