Mam ArrayList
niestandardowe obiekty. Każdy obiekt niestandardowy zawiera szereg ciągów i liczb. Potrzebuję tablicy, aby pozostała, nawet jeśli użytkownik opuści aktywność, a następnie chce wrócić później, jednak nie potrzebuję tablicy dostępnej po całkowitym zamknięciu aplikacji. W ten sposób zapisuję wiele innych obiektów, SharedPreferences
ale nie mogę wymyślić, jak zapisać w ten sposób całą moją tablicę. czy to możliwe? Może SharedPreferences
nie jest na to sposób? Czy istnieje prostsza metoda?
android
arraylist
sharedpreferences
ryandlf
źródło
źródło
Odpowiedzi:
Po API 11
SharedPreferences Editor
zaakceptujSets
. Możesz przekonwertować swoją listę naHashSet
coś podobnego i przechowywać ją w ten sposób. Po ponownym przeczytaniu przekonwertuj go naArrayList
, posortuj w razie potrzeby i możesz zacząć.Możesz także serializować swój,
ArrayList
a następnie zapisać / odczytać go do / zSharedPreferences
. Poniżej znajduje się rozwiązanie:EDYCJA:
Ok, poniżej znajduje się rozwiązanie, aby zapisać
ArrayList
jako obiekt zserializowany,SharedPreferences
a następnie odczytać go z SharedPreferences.Ponieważ API obsługuje tylko przechowywanie i pobieranie ciągów znaków do / z SharedPreferences (po API 11, jego prostsze), musimy serializować i usuń serializację obiektu ArrayList, który ma listę zadań w łańcuch.
W
addTask()
metodzie klasy TaskManagerApplication musimy uzyskać instancję współużytkowanej preferencji, a następnie przechowywać zserializowaną ArrayList za pomocąputString()
metody:Podobnie musimy pobrać listę zadań z preferencji w
onCreate()
metodzie:Możesz pobrać
ObjectSerializer
klasę z projektu Apache Pig ObjectSerializer.javaźródło
putStringSet
został dodany w API 11. Większość obecnych programistów celuje w leasing API 8 (Froyo).scoreEditor
?Korzystanie z tego obiektu -> TinyDB - Android-Preferencje współdzielone-Turbo jest bardzo proste.
położyć
dostać
AKTUALIZACJA
Kilka przydatnych przykładów i sposobów rozwiązywania problemów można znaleźć tutaj: Wspólna preferencja Androida TinyDB putListObject frakcja
źródło
tinydb.putList()
Spójrz na przykłady na połączonej stronie.Zapisywanie
Array
wSharedPreferences
:Ładowanie
Array
danych zSharedPreferences
źródło
ArrayList
w sobie,SharedPrefeneces
możeszmEdit1.clear()
tego uniknąć.Możesz przekonwertować go
JSON String
i zapisać ciąg wSharedPreferences
.źródło
Jak powiedział @nirav, najlepszym rozwiązaniem jest przechowywanie go w sharedPrefernces jako tekstu json za pomocą klasy narzędziowej Gson. Poniżej przykładowy kod:
źródło
Hej przyjaciele, mam rozwiązanie powyższego problemu bez korzystania z
Gson
biblioteki. Tutaj zamieszczam kod źródłowy.1. Deklaracja zmienna tj
2. Zmienna inicjalizacja tj
3.Zapisz wartość do sharedPreference, używając
packagesharedPreferences()
:4.Usuń wartość sharedPreference za pomocą
retriveSharedValue()
:Mam nadzieję, że to ci pomoże ...
źródło
String
s?JAWA:
Kotlin
źródło
Android SharedPreferances pozwala zapisywać w pamięci pierwotne typy (Boolean, Float, Int, Long, String i StringSet, które są dostępne od API11) jako plik xml.
Kluczową ideą każdego rozwiązania byłoby przekonwertowanie danych na jeden z tych pierwotnych typów.
Osobiście uwielbiam konwertować moją listę do formatu json, a następnie zapisać ją jako ciąg znaków w wartości SharedPreferences.
Aby skorzystać z mojego rozwiązania, musisz dodać bibliotekę Google Gson .
W stopniach po prostu dodaj następującą zależność (użyj najnowszej wersji Google):
Zapisz dane (gdzie HttpParam jest twoim obiektem):
Odzyskaj dane (gdzie HttpParam jest twoim obiektem):
źródło
To jest twoje idealne rozwiązanie .. spróbuj,
źródło
Możesz także przekonwertować listę arraylist na String i zapisać ją w preferencjach
Możesz zapisać Arraylist po przekonwertowaniu go na ciąg za pomocą
convertToString
metody, a następnie pobrać ciąg i przekonwertować go na tablicę za pomocąconvertToArray
Po API 11 możesz zapisać zestaw bezpośrednio do SharedPreferences !!! :)
źródło
W przypadku String, int, boolean najlepszym wyborem byłyby sharedPreferences.
Jeśli chcesz przechowywać ArrayList lub dowolne złożone dane. Najlepszym wyborem będzie biblioteka papieru.
Dodaj zależność
Zainicjuj papier
Należy zainicjować raz w Application.onCreate ():
Zapisać
Ładowanie danych
Użyj wartości domyślnych, jeśli obiekt nie istnieje w pamięci.
Proszę bardzo.
https://github.com/pilgr/Paper
źródło
Przeczytałem wszystkie odpowiedzi powyżej. To wszystko prawda, ale znalazłem łatwiejsze rozwiązanie, jak poniżej:
Zapisywanie listy ciągów w preferencjach wspólnych >>
}
oraz w celu uzyskania listy ciągów z preferencji współdzielonych >>
Oto
Constants.APP_PREFS
nazwa pliku do otwarcia; nie może zawierać separatorów ścieżek.źródło
Również z Kotlinem:
źródło
Najlepszym sposobem jest konwersja na ciąg JSOn za pomocą GSON i zapisanie tego ciągu na SharedPreference. Korzystam również z tego sposobu buforowania odpowiedzi.
źródło
Możesz zapisać ciąg i niestandardową listę tablic przy użyciu biblioteki Gson.
=> Najpierw musisz utworzyć funkcję, aby zapisać listę tablic w SharedPreferences.
=> Musisz utworzyć funkcję, aby uzyskać listę tablic z SharedPreferences.
=> Jak wywołać funkcję zapisywania i pobierania listy tablic.
=> Nie zapomnij dodać biblioteki gson do swojego poziomu build.gradle na poziomie aplikacji.
wdrożenie „com.google.code.gson: gson: 2.8.2”
źródło
Możesz odwoływać się do funkcji serializeKey () i deserializeKey () z klasy SharedPreferencesTokenCache FacebookSDK. Konwertuje obsługiwany typ na obiekt JSON i przechowuje ciąg JSON w SharedPreferences . Możesz pobrać SDK stąd
źródło
Dlaczego nie naklejasz swojej tablicy na klasę aplikacji? Zostaje zniszczony tylko wtedy, gdy aplikacja zostanie naprawdę zabita, więc pozostanie tak długo, jak długo aplikacja będzie dostępna.
źródło
Najlepszym sposobem, jaki udało mi się znaleźć, jest utworzenie tablicy kluczy 2D i umieszczenie niestandardowych elementów tablicy w tablicy kluczy 2D, a następnie pobranie jej przez tablicę 2D podczas uruchamiania. Nie podobał mi się pomysł użycia zestawu strun, ponieważ większość użytkowników Androida nadal korzysta z Gingerbread, a korzystanie z zestawu strun wymaga plastra miodu.
Przykładowy kod: tutaj ditor jest współdzielonym edytorem wstępnym, a rowitem jest moim niestandardowym obiektem.
źródło
poniższy kod jest akceptowaną odpowiedzią, z kilkoma dodatkowymi wierszami dla nowych ludzi (ja), np. pokazuje, jak przekonwertować obiekt typu zestawu z powrotem na arrayList oraz dodatkowe wskazówki na temat tego, co dzieje się przed „.putStringSet” i „.getStringSet”. (dziękuję ci zło)
źródło
źródło
nie zapomnij wdrożyć Serializable:
https://stackoverflow.com/a/7635154/4639974
źródło
Można użyć serializacji lub biblioteki Gson, aby przekonwertować listę na ciąg znaków i odwrotnie, a następnie zapisać ciąg w preferencjach.
Korzystając z biblioteki Google Gson:
Korzystanie z serializacji Java:
źródło
Ta metoda służy do przechowywania / zapisywania listy tablic: -
Ta metoda służy do pobierania listy tablic:
źródło
Możesz przekonwertować go na
Map
obiekt, aby go zapisać, a następnie zmienić wartości z powrotem na ArrayList podczas pobieraniaSharedPreferences
.źródło
Użyj tej niestandardowej klasy:
Jak używać:
źródło
to powinno działać:
je, aby to złapać:
mi to pasuje.
źródło
Moja klasa utils do listy zapisywania w
SharedPreferences
Za pomocą
.
Pełny kod moich narzędzi // sprawdź, korzystając z przykładu w kodzie działania
źródło
Użyłem tego samego sposobu zapisywania i pobierania ciągu, ale tutaj z tablicą tablic użyłem HashSet jako mediatora
Aby zapisać arrayList w SharedPreferences, używamy HashSet:
1- tworzymy zmienną SharedPreferences (w miejscu, w którym następuje zmiana w tablicy)
2 - konwertujemy arrayList na HashSet
3 - następnie kładziemy stringSet i stosujemy
4 - dostajeszStringSet w HashSet i ponownie tworzysz ArrayList, aby ustawić HashSet.
źródło
źródło
Wszystkie powyższe odpowiedzi są poprawne. :) Sam użyłem jednego z nich do mojej sytuacji. Jednak kiedy przeczytałem pytanie, odkryłem, że OP mówi o innym scenariuszu niż tytuł tego postu, jeśli nie pomyliłem się.
„Potrzebuję, aby tablica pozostała, nawet jeśli użytkownik porzuci aktywność, a następnie wróci później”
W rzeczywistości chce, aby dane były przechowywane do momentu otwarcia aplikacji, niezależnie od zmieniających się ekranów użytkownika w aplikacji.
„jednak nie potrzebuję tablicy dostępnej po całkowitym zamknięciu aplikacji”
Ale kiedy aplikacja zostanie zamknięta, dane nie powinny zostać zachowane
SharedPreferences
nie jest optymalnym sposobem na to.Aby spełnić ten wymóg, można stworzyć klasę, która się rozszerza
Application
klasę.Za pomocą narzędzia do ustawiania i pobierania można uzyskać dostęp do ArrayList z dowolnego miejsca za pomocą aplikacji. A najlepsze jest to, że po zamknięciu aplikacji nie musimy się martwić o przechowywanie danych. :)
źródło