2016-03-08 53 views
1

我正在清理一些非常舊的應用程序中的一些錯誤編碼選項。在我做的第一個應用程序中,有一個用戶登錄。所以,我用SharedPreferences來存儲user_id。這應該是一個long一直。不幸的是,我最初將它存儲爲String更改已存在的SharedPreference值中的數據類型

我回去糾正這個問題。然而,我當然得到ClassCastException,因爲我試圖將String作爲long

這是它如何工作後進行更改我的代碼:

public static void setLoggedInUserId(Context ctx, long id) { 
    Editor editor = getSharedPreferences(ctx).edit(); 
    editor.putLong(PREF_LOGGEDIN_USER_USERID, id); 
    editor.apply(); 
} 

public static long getLoggedInUserId(Context ctx) { 
    // need to handle String to long conversion here? 
    return getSharedPreferences(ctx).getLong(PREF_LOGGEDIN_USER_USERID, 0); 
} 

什麼是處理這個問題最徹底的方法,因此儘可能透明給用戶(我不希望強制如果可能,退出)。

編輯

由於我打字,是一個好的解決辦法?

return Long.valueOf(getSharedPreferences(ctx).getString(PREF_LOGGEDIN_USER_USERID, 0));

一個問題:這隻會工作的第一次要解決舊數據;因爲在此之後,基於setter方法的偏好將是long

下一個最佳選擇:我可以測試存儲在preference中的類型,可能是typeof

回答

1
  1. getLoggedInUserId,趕類轉換異常

  2. 讀取共享偏好(字符串)值和Long.parseLong()

  3. 轉換它創建一個編輯器,put長值,承諾。

此代碼將剛好運行一次,然後你就再也不用擔心邊緣情況。

+0

工作很好;謝謝... – KickingLettuce

1

把這個在這個值之前您的MainActivity被稱爲首次

 if(!prefs.getBoolean("ConversionDone", false)){ 
      String currentStringValue = prefs.String(PREF_LOGGEDIN_USER_USERID, 0); 
      prefs.edit().remove(PREF_LOGGEDIN_USER_USERID).commit(); 
      prefs.edit().putLong(PREF_LOGGEDIN_USER_USERID, Long.parseLong(currentStringValue)).commit(); 
      prefs.edit().putBoolean("ConversionDone", true).commit(); 
     } 

,並在下次更新時,您可以將其刪除。