在我的应用程序中,我有一个自定义User
类,它包含一些常规数据(名称等...)。我需要保存该对象并随时随地在应用程序的其他页面中获取它。我用很多方法制作了一个帮助类public final class GeneralMethods
,我经常使用它(当然是静态的)。
为了使用Gson
库保存数据Im。我做了这个方法:
public static void saveData(Context con, String variable, String data)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
prefs.edit().putString(variable, data).apply();
}
要保存对象,我使用以下方法:
Gson gson = new Gson();
String stringUser = gson.toJson(newUser);
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
要加载数据,我正在使用这种静态方法:
public static String getData(Context con, String variable, String defaultValue)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
String data = prefs.getString(variable, defaultValue);
return data;
}
我真的不知道如何获取数据,这是我到目前为止所做的:
Gson gson = new Gson();
String user="";
String value="";
user = GeneralMethods.getData(SplashScreenActivity.this,value,"userObject");
我正在努力使用getData
方法,如何将String
的数据解析回User
类型?
EDIT
我尝试了下面的建议,我总是得到NULL
。也许我不以正确的方式保存对象?
EDIT2
我似乎没有正确生成对象,因此没有任何东西被保存。这是用户“Singleton”类:
public class User implements Serializable {
private static User userInstance=null; //the only instance of the class
private static String userName; //userName = the short phone number
private User(){}
public static User getInstance(){
if(userInstance ==null){
userInstance = new User();
}
return userInstance;
}
public static User getUserInstance() {
return userInstance;
}
public String getUserName(){
return this.userName;
}
public static void setUserName(String userName) {
User.userName = userName;
}
public static void init(String _userName) {
User.setUserName(_userName);
}
}
这是我使用相关数据(用户名作为构造函数参数)设置对象的方法:
User.init(name);
这是我将对象转换为String
的方式:
Gson gson = new Gson();
String stringUser = gson.toJson(User.getInstance());
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
答案 0 :(得分:5)
将现有的用户类替换为下面的
public class User implements Serializable
{
private static User userInstance = null; // the only instance of the class
private String userName; // userName = the short phone number
private User(){}
public static User getInstance()
{
if (userInstance == null)
{
userInstance = new User();
}
return userInstance;
}
public String getUserName()
{
return userName;
}
public void setUserName(String p_userName)
{
userName = p_userName;
}
@Override
public String toString()
{
return "User [userName=" + getUserName() + "]";
}
}
初始化用户名
User m_user = User.getInstance();
m_user.setUserName(name);
将对象转换为String
Gson gson = new Gson();
String stringUser = gson.toJson(m_user);
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
答案 1 :(得分:3)
我建议您使用依赖注入模式。
我通常创建Preferences
类,公开getter和setter以快速读取并将值保存到SharedPreferences
。
我使用Dagger作为依赖注入器在代码中的任何位置注入相同的Preferences
实例。
为什么在public static
助手上使用 Singleton 对象?
如果你有一个直接使用的辅助类实用程序函数,它会创建一个隐藏的依赖项;你无法控制谁可以使用它,或者在哪里。通过无状态单例实例注入相同的帮助程序类,可以控制它的使用位置和方式,并在需要时替换它/模拟/等等。
了解更多here。
Preferences
类的示例:
@Singleton
public class Preferences {
private SharedPreferences sharedPreferences;
private final String NOTIFICATIONS_ENABLED = "NOTIFICATIONS_ENABLED";
@Inject
public Preferences(Context context) {
sharedPreferences = context.getSharedPreferences("Preferences", 0);
}
public void setNotificationsEnabled(boolean enabled){
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putBoolean(NOTIFICATIONS_ENABLED, enabled);
edit.commit();
}
public boolean isNotificationsEnabled(){
return sharedPreferences.getBoolean(NOTIFICATIONS_ENABLED, true);
}
}
以及如何在Activity
中使用它:
public class MainActivity extends Activity {
@Inject
NavigationController navigationController;
@Inject
Preferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedObjectGraph.getObjectGraph().inject(this);
if(preferences.isNotificationsEnabled()){
// do something
}
}
答案 2 :(得分:2)
您只需要替换一行代码
user = GeneralMethods.getData(SplashScreenActivity.this,value,"userObject");
要
user = GeneralMethods.getData(SplashScreenActivity.this,"userObject",value);
答案 3 :(得分:2)
我们可以通过使用Gson库来实现这一点。并且可以通过应用程序访问共享首选项。我创建了自己的类来访问共享的pref,其中包含所有类型的getter和setter,如String,Int,Object等。
要使用Gson Library,下面是代码。如果你想要我创建的课程,请告诉我
您可以使用gson.jar将类对象存储到SharedPreferences中。你可以从这里https://code.google.com/p/google-gson/downloads/list
下载这个罐子或者在Gradle文件中添加GSON依赖
编译'com.google.code.gson:gson:2.5'
保存
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(MyObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
要退却
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
希望这会对你有所帮助 Summved
答案 4 :(得分:0)
用于获取数据 -
//Creating a shared preference
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
希望这会有所帮助:)
答案 5 :(得分:0)
public static String getData(Context con, String variable)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
String data = prefs.getString(variable, null);
return data;
}
Gson gson = new Gson();
String json = GeneralMethods.getData(SplashScreenActivity.this,"userObject");
if(json!=null){
MyObject obj = gson.fromJson(json, MyObject.class);
}
答案 6 :(得分:0)
你正确地做了,但我认为你已经在getData方法中切换了两个字段。
你有这个方法:
public static String getData(Context con, String variable, String defaultValue)
{....}
但你发送的是:
user = GeneralMethods.getData(SplashScreenActivity.this,value,"userObject");
这意味着您的变量是this.value,而defaultValue是“userObject”。我相信你想以相反的方式拥有它
答案 7 :(得分:0)
这将帮助您创建一个共享首选项类,并在任何类中的任何位置使用它。
创建名为MySharedPreferences的类
function load(){
var checked = JSON.parse(localStorage.getItem('lightSwitch'));
if (document.getElementById("lightSwitch").checked !== checked) {
swapStyleSheet(); // Swap if the value changed
}
// assign the changed value
document.getElementById("lightSwitch").checked = checked;
}
并使用
public class MySharedPreferences
{
public static final String mySharedPrefrences = "MyPrefs" ;
public static SharedPreferences sharedPreferences;
public static SharedPreferences.Editor editor;
private static MySharedPreferences instance;
public static MySharedPreferences with(Context context) {
if (instance == null) {
instance = new MySharedPreferences(context);
}
return instance;
}
public MySharedPreferences(Context context)
{
sharedPreferences=context.getSharedPreferences(mySharedPrefrences, Context.MODE_PRIVATE);
}
public static String getUserId(String str_userid)
{
if (sharedPreferences!= null) {
return sharedPreferences.getString(str_userid, "");
}
return "";
}
public void saveUserId(String str_userId_key,String str_userId_value)
{
editor = sharedPreferences.edit();
editor.putString(str_userId_key,str_userId_value);
editor.commit();
}
public void clearAllData(Context context)
{
sharedPreferences = context.getSharedPreferences(mySharedPrefrences, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear().apply();
}
}