2013-07-04 4 views
18

Próbuję użyć androidów sharedpreferences, Logowałem wszystko, a poniższy kod naprawdę zatwierdza zestaw ciągów znaków. Problem polega na tym, że kiedy zamykam aplikację i zaczynam od nowa, settings.getStringSet zwraca pusty zestaw. Nigdzie nie ma błędów.Zestaw <String> w Androidzie sharedpreferences nie zapisuje na siłę close

Próbowałem już PreferenceManager.getDefaultSharedPreferences, ale to też nie działa.

Dzięki za poświęcony czas.

public static final String PREFS_NAME = "MyPrefsFile"; 
private static final String FOLLOWED_ROUTES = "followedRoutes"; 

i później, gdy zapisana jest nazywany:

public void onFollowClicked(View view){ 

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
SharedPreferences.Editor editor = settings.edit(); 

Set<String> follows = settings.getStringSet(FOLLOWED_ROUTES, new HashSet<String>()); 
follows.add(routeId); 

editor.putStringSet(FOLLOWED_ROUTES, follows); 
editor.commit(); 

} 
+0

W czym problem? – Blackbelt

+1

Czy przestrzegasz cyklu życia? W jakim stanie zapisujesz swoje dane? –

+0

wszystko jest zapisane, zanim wymuszam zakończenie. kwestia jest taka, że ​​settings.getStringSet (... nie zwraca wartości I przyznaniem mu Ive próbował również zastąpienie commit(), aby zastosować (.) - bez powodzenia – Malin

Odpowiedz

18

Spójrz here.

Również refference:

SharedPreferences

SharedPreferences.Editor

EDIT:

Jest rzeczywiście bug z tym jednym, zobaczyć here. Ekstrakt z tego:

Ten problem nadal występuje na 17 poziomach interfejsu API.

Jest to spowodowane tym, że metoda getStringSet() klasy SharedPreferences nie zwraca kopię obiektu Set: to zwraca cały obiekt, a po dodaniu nowych elementów, tym commitToMemory metoda klasa SharedPrefencesImpl.EditorImpl zobacz , że istniejąca wartość jest równa poprzedniej zapisanej.

Sposoby obejścia tego problemu jest zrobić kopię Zestaw zwróconej przez SharedPreferences.getStringSet lub wymusić zapis do pamięci za pomocą innego że zawsze zmienić preferencje (na przykład właściwość który przechowuje wielkości ustawić za każdym razem)

EDIT2:

Nie może być rozwiązaniem here, przyjrzeć.

+1

Nie można utworzyć wystąpienia typu Set , ponieważ set to tylko interfejs – Malin

+0

Po prostu pytanie, jakie jest twoje minSDK w "AndroidManifest"? – g00dy

+0

działa dobrze, jeśli używam ciąg, ale nie stringSet, i to jest to, czego potrzebuję. Próbowałem również: HashSet follow = (HashSet ) settings.getStringSet (FOLLOWED_ROUTES, nowy HashSet ()); – Malin

16

Można też obejść błędu wymienionego przez g00dy ten sposób:

Pobierz zestaw z sharedPreferences i zapisać ją w zmiennej.

Następnie po prostu usuń zestaw w sharedpreferences przed dodaniem go ponownie podczas zapisywania.

SharedPreferences.Editor editor= sharedPref.edit(); 
editor.remove("mSet"); 
editor.apply(); 
editor.putStringSet("mSet", mSet); 
editor.apply(); 

Upewnij się, że dwukrotnie użyłeś apply() lub commit().

+4

To uratowało mi życie, chciałbym, żeby było lepiej udokumentowane. –

+2

jest to lepsze niż przyjęte rozwiązanie – AKTO