2011-07-20 14 views
2

パスワードジェネレータを更新しようとしていますパスワードを保存する機能を追加しましたので、SharedPreferencesを使用しています。保存したパスワードをSetに入れたいのですが、SharedPreferences.EditorのputStringSetメソッドを使ってセットを保存しようとすると、Eclipseはそれを認識しません。私のコードでputStringSetにカーソルを合わせると、利用可能な2つのクイックフィックスは "putString(...)に変更"と "エディタへのキャストを追加"ですが、どちらも役に立ちません。Android SharedPreferences.Editor putStringSetメソッドが利用できません

これは私が持っているものです。

public void save(View v) 
{ 
    SharedPreferences prefs = getPreferences(MODE_PRIVATE); 
    final SharedPreferences.Editor editor = prefs.edit(); 
    savedPasswords = (Set<String>) getSharedPreferences("savedPasswordsList", 0); 
    AlertDialog.Builder dialog = new AlertDialog.Builder(this); 
    dialog.setItems(passwords, new DialogInterface.OnClickListener(){ 
     public void onClick(DialogInterface face, int num) 
     { 
      savedPasswords.add(passwords[num]); 
      editor.putStringSet("savedPasswordsList", savedPasswords); 
      editor.commit(); 
      refreshSavedPasswordsList(); 
     } 
    }); 
    dialog.show(); 
} 

答えて

7

putStringSet(...)は、API 11(以降のAndroid v3.0.x)で添加しました。私の推測では、あなたはそれより下のバージョンをターゲットにしています。

+0

バージョン2.1,2.2、または2.3のコードを含めてアップグレードする方法はありませんか?これらのバージョンでサポートされている文字列のリストを格納する他の方法はありますか? –

+1

v3 +コードがGoogleによってオープンソース化されていた場合、あなた自身のバージョンのエディタでコピーを試みることができましたが、Set を直接使用するpre v3システムでは何もできません。あなたができる唯一のことは、パスワードを 'putString(...) 'を使って別々に置くことです。私は個人的にstrPass1、strPass2などのキー名を持つ文字列としてそれらを保存するでしょう。私はSharedPreferencesの 'getAll()'メソッドを使い、返された 'Map'チェックを反復してキー名が ' strPassを作成し、それを使って 'Set 'をビルドします。痛いですが、うまくいくでしょう。 – Squonk

+1

omg ...だから私はこれを本当に使いたかったのですが、私の電話は2.3.3で、api lev maxは10です。だから私はこれを使用することはできません。なぜ彼らは始めからこのことをしなかったのですか?それはputintとput stringが十分ではないことは非常に直感的です..... –

0

私はこのスレッドが古いと知っていますが、私はちょうど同じ問題に遭遇しました。私の解決策は、グローバルなHashTableを使用して実際にファイル名だった文字列を追跡することでした。私はまた、各ファイルに関連付けられた状態を必要に応じて、私は次のような単純なクラスを実装:

public class Globals 
    { 
     public static enum SendStatus 
     { 
      NOT_SENT, 
      SEND_SUCCESS, 
      SEND_ERROR 
     } 

     public static volatile Hashtable<String, SendStatus> StoredFilesStatus; 

     } 
    } 
2

私はputStringSetを使用してデータストレージを実装して、私はJSONSharedPreferencesと呼ばれる小さなクラスを作成したジンジャーブレッドにそれをバックポートする必要がありました。

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.content.SharedPreferences; 


    public class JSONSharedPreferences { 
     private static final String PREFIX = "json"; 

     public static void saveJSONObject(SharedPreferences prefs, String key, JSONObject object) { 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString(JSONSharedPreferences.PREFIX+key, object.toString()); 
      editor.commit(); 
     } 

     public static void saveJSONArray(SharedPreferences prefs, String key, JSONArray array) { 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString(JSONSharedPreferences.PREFIX+key, array.toString()); 
      editor.commit(); 
     } 

     public static JSONObject loadJSONObject(SharedPreferences prefs, String key) throws JSONException { 
      return new JSONObject(prefs.getString(JSONSharedPreferences.PREFIX+key, "{}")); 
     } 

     public static JSONArray loadJSONArray(SharedPreferences prefs, String key) throws JSONException { 
      return new JSONArray(prefs.getString(JSONSharedPreferences.PREFIX+key, "[]")); 
     } 

     public static void remove(SharedPreferences prefs, String key) { 
      if (prefs.contains(JSONSharedPreferences.PREFIX+key)) { 
       SharedPreferences.Editor editor = prefs.edit(); 
       editor.remove(JSONSharedPreferences.PREFIX+key); 
       editor.commit(); 
      } 
     } 
    } 

使用法:

//Below, the code to use putStringSet is commented out. 
//Alternative JSONSharedPreferences is used instead 

//Set<String> trainers = new TreeSet<String>();  
JSONArray jTrainers = new JSONArray(); 
List<FilteredWorkoutVideo> videos = getAllFilteredVideos(prefs); 
for (FilteredWorkoutVideo video : videos) { 
    //trainers.add(video.getTrainerName()); 
    jTrainers.put(video.getTrainerName()); 
} 

//e = prefs.edit(); 
//e.putStringSet(Constants.KEY_ALL_TRAINERS, trainers); 
//e.apply(); 
JSONSharedPreferences.saveJSONArray(prefs, Constants.KEY_ALL_TRAINERS, jTrainers); 
1

この問題を回避するために、私はSharedPreferencesCompatクラスを作成しました:

文字列CSVスタイルに格納StringSetで。

CVSで使用される '、'を別の区切り文字で変更することは可能です。

public class SharedPreferencesCompat { 

    private final static String KEY_DELIMITER = "com.example.delimiter"; 

    public static void setStringSetDelimiter(final SharedPreferences sharedPreferences, final String delimiter) { 
     final Editor editor = sharedPreferences.edit(); 
     editor.putString(KEY_DELIMITER, delimiter); 
     editor.commit(); 
    } 

    public static Set<String> getStringSet(final SharedPreferences sharedPreferences, final String key) { 
     final Set<String> out = new LinkedHashSet<String>(); 
     final String base = sharedPreferences.getString(key, null); 
     if (base != null) { 
      out.addAll(Arrays.asList(base.split(sharedPreferences.getString(KEY_DELIMITER, ",")))); 
     } 
     return out; 
    } 

    public static void putStringSet(final SharedPreferences sharedPreferences, final String key, 
     final Set<String> stringSet) { 
     final String concat = StringUtils.join(stringSet, sharedPreferences.getString(KEY_DELIMITER, ",")); 
     final Editor editor = sharedPreferences.edit(); 
     editor.putString(key, concat); 
     editor.commit(); 
    } 
} 

これは、Apache StringUtils.join()メソッドに依存します。

もう1つは簡単に交換できます。

関連する問題