Как сохранить объект класса в android sharedPreference?
Я хотел бы сохранить объект класса в android sharedpreference. Я сделал некоторый базовый поиск по этому, и я получил некоторые ответы, такие как сделать его сериализуемым объектом и сохранить его, но моя потребность так проста. Я хотел бы сохранить некоторую информацию о пользователе, такую как имя, адрес, возраст и логическое значение. Я сделал для этого один пользовательский класс.
public class User {
private String name;
private String address;
private int age;
private boolean isActive;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isActive() {
return isActive;
}
public void setActive(boolean isActive) {
this.isActive = isActive;
}
}
спасибо.
5 ответов
скачать
gson-1.7.1.jar
по этой ссылке GsonLibJarдобавьте эту библиотеку в свой проект android и настройте путь сборки.
-
добавьте в пакет следующий класс.
package com.abhan.objectinpreference; import java.lang.reflect.Type; import android.content.Context; import android.content.SharedPreferences; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class ComplexPreferences { private static ComplexPreferences complexPreferences; private final Context context; private final SharedPreferences preferences; private final SharedPreferences.Editor editor; private static Gson GSON = new Gson(); Type typeOfObject = new TypeToken<Object>(){} .getType(); private ComplexPreferences(Context context, String namePreferences, int mode) { this.context = context; if (namePreferences == null || namePreferences.equals("")) { namePreferences = "abhan"; } preferences = context.getSharedPreferences(namePreferences, mode); editor = preferences.edit(); } public static ComplexPreferences getComplexPreferences(Context context, String namePreferences, int mode) { if (complexPreferences == null) { complexPreferences = new ComplexPreferences(context, namePreferences, mode); } return complexPreferences; } public void putObject(String key, Object object) { if (object == null) { throw new IllegalArgumentException("Object is null"); } if (key.equals("") || key == null) { throw new IllegalArgumentException("Key is empty or null"); } editor.putString(key, GSON.toJson(object)); } public void commit() { editor.commit(); } public <T> T getObject(String key, Class<T> a) { String gson = preferences.getString(key, null); if (gson == null) { return null; } else { try { return GSON.fromJson(gson, a); } catch (Exception e) { throw new IllegalArgumentException("Object stored with key " + key + " is instance of other class"); } } } }
-
создайте еще один класс, расширив
Application
класс такойpackage com.abhan.objectinpreference; import android.app.Application; public class ObjectPreference extends Application { private static final String TAG = "ObjectPreference"; private ComplexPreferences complexPrefenreces = null; @Override public void onCreate() { super.onCreate(); complexPrefenreces = ComplexPreferences.getComplexPreferences(getBaseContext(), "abhan", MODE_PRIVATE); android.util.Log.i(TAG, "Preference Created."); } public ComplexPreferences getComplexPreference() { if(complexPrefenreces != null) { return complexPrefenreces; } return null; } }
-
добавьте этот класс приложения в свой манифест
application
tag like этот.<application android:name=".ObjectPreference" android:allowBackup="false" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > ....your activities and the rest goes here </application>
-
в вашей основной деятельности, где вы хотите сохранить значение в
Shared Preference
сделайте что-то вроде этого.package com.abhan.objectinpreference; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { private final String TAG = "MainActivity"; private ObjectPreference objectPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); objectPreference = (ObjectPreference) this.getApplication(); User user = new User(); user.setName("abhan"); user.setAddress("Mumbai"); user.setAge(25); user.setActive(true); User user1 = new User(); user1.setName("Harry"); user.setAddress("London"); user1.setAge(21); user1.setActive(false); ComplexPreferences complexPrefenreces = objectPreference.getComplexPreference(); if(complexPrefenreces != null) { complexPrefenreces.putObject("user", user); complexPrefenreces.putObject("user1", user1); complexPrefenreces.commit(); } else { android.util.Log.e(TAG, "Preference is null"); } } }
-
в другой деятельности, где вы хотите получить значение из
Preference
сделайте что-то вроде этого.package com.abhan.objectinpreference; import android.app.Activity; import android.os.Bundle; public class SecondActivity extends Activity { private final String TAG = "SecondActivity"; private ObjectPreference objectPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); objectPreference = (ObjectPreference) this.getApplication(); ComplexPreferences complexPreferences = objectPreference.getComplexPreference(); android.util.Log.i(TAG, "User"); User user = complexPreferences.getObject("user", User.class); android.util.Log.i(TAG, "Name " + user.getName()); android.util.Log.i(TAG, "Address " + user.getAddress()); android.util.Log.i(TAG, "Age " + user.getAge()); android.util.Log.i(TAG, "isActive " + user.isActive()); android.util.Log.i(TAG, "User1"); User user1 = complexPreferences.getObject("user", User.class); android.util.Log.i(TAG, "Name " + user1.getName()); android.util.Log.i(TAG, "Address " + user1.getAddress()); android.util.Log.i(TAG, "Age " + user1.getAge()); android.util.Log.i(TAG, "isActive " + user1.isActive()); } }
надеюсь, это поможет вам. В этом ответе я использовал ваш класс для ссылки "пользователь", чтобы вы могли лучше понять. Однако мы не можем полагаться на этот метод, если вы выбрали для хранения очень больших объектов в предпочтении, как мы все знаем, что у нас ограниченный размер памяти для каждого приложения в каталоге данных, так что если вы уверены, что у вас есть только ограниченные данные для хранения в общих предпочтениях вы можете использовать эту альтернативу.
любые предложения по этой реализации приветствуются.
другой способ-сохранить каждое свойство само по себе..Предпочтения принимают только примитивные типы, поэтому вы не можете поместить в него сложный объект
вы можете просто добавить некоторые обычные SharedPreferences "name", "address", "age" & "isActive" и просто загрузить их при создании экземпляра класса
вы можете использовать глобальный класс
public class GlobalState extends Application
{
private String testMe;
public String getTestMe() {
return testMe;
}
public void setTestMe(String testMe) {
this.testMe = testMe;
}
}
а затем найдите тег приложения в nadroid menifest и добавьте в него следующее:
android:name="com.package.classname"
и вы можете установить и получить данные из любой вашей деятельности, используя следующий код.
GlobalState gs = (GlobalState) getApplication();
gs.setTestMe("Some String");</code>
// Get values
GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();
простое решение о том, как сохранить значение входа в SharedPreferences.
вы можете расширить класс MainActivity или другой класс, где вы будете хранить "значение того, что вы хотите сохранить". Поместите это в классы писателя и читателя:
public static final String GAME_PREFERENCES_LOGIN = "Login";
здесь InputClass является входным, а OutputClass-выходным классом соответственно.
// This is a storage, put this in a class which you can extend or in both classes:
//(input and output)
public static final String GAME_PREFERENCES_LOGIN = "Login";
// String from the text input (can be from anywhere)
String login = inputLogin.getText().toString();
// then to add a value in InputCalss "SAVE",
SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);
Editor editor = example.edit();
editor.putString("value", login);
editor.commit();
Теперь вы можете использовать его где-то еще, как и другой класс. Ниже приведен OutputClass.
SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);
String userString = example.getString("value", "defValue");
// the following will print it out in console
Logger.getLogger("Name of a OutputClass".class.getName()).log(Level.INFO, userString);