在我的应用程序中,用户登录LoginActivity
,使用我创建的SessionManager
类创建登录会话(我有一个SharedPreferences
对象,用于我put
用户的电子邮件,并将布尔值isLoggedIn
设置为true。
现在,我真正想要做的是将登录后从JSONObject
服务器获得的用户LoginActivity
放入SharedPreferences
。基本上我希望能够在用户登录时从应用程序的任何位置访问JSON
文档。
但是,我意识到我无法将JSONObject
放入编辑器中。实现我正在描述的功能的正确方法是什么?
如果相关......这是我的SessionManager
类,其中有一个SharedPreferences
对象(我不知道这是否是最好的方法):
package com.xxx.xxxx;
import java.util.HashMap;
import com.xxxx.auth.LoginActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class SessionManager {
// Shared Preferences
SharedPreferences pref;
// Editor for Shared preferences
Editor editor;
// Context
Context _context;
// Shared pref mode
int PRIVATE_MODE = 0;
// Sharedpref file name
private static final String PREF_NAME = "PREFS";
// All Shared Preferences Keys
private static final String IS_LOGIN = "IsLoggedIn";
// Email address
public static final String KEY_EMAIL = "email";
// Constructor
public SessionManager(Context context) {
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
/** Create login session */
public void createLoginSession(String email){
// Storing login value as TRUE
editor.putBoolean(IS_LOGIN, true);
// Storing email in pref
editor.putString(KEY_EMAIL, email);
// I WANTED TO STORE THE JSON HERE AFTER PASSING IT AS A PARAMETER
// IN THE METHOD
// commit changes
editor.commit();
}
/**
* Get stored session data
* */
public HashMap<String, String> getUserDetails(){
HashMap<String, String> user = new HashMap<String, String>();
// user email id
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
// return user
return user;
}
/**
* Clear session details
* */
public void logoutUser(){
// Clearing all data from Shared Preferences
editor.clear();
editor.commit();
redirect();
}
public void redirect() {
//redirect user to Login Activity
Intent i = new Intent(_context, LoginActivity.class);
// Closing all the Activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Staring Login Activity
_context.startActivity(i);
}
// Get Login State
public boolean isLoggedIn() {
return pref.getBoolean(IS_LOGIN, false);
}
}
答案 0 :(得分:3)
您只能在偏好设置http://developer.android.com/reference/android/content/SharedPreferences.Editor.html中存储简单类型。如果你真的想保存JSON,请将其保存为String并使用GSON(https://code.google.com/p/google-gson/)或其他一些JSON映射器进行解析。
答案 1 :(得分:1)
您可以在SD卡内的文件中序列化JSONObject
。 SharedPreferences
并非旨在处理它。但是不要在文件中添加敏感数据。如果JSONObject
大小很小,那么您可以尝试以下代码。您需要Gson
库才能执行此操作。
public static void setJSONObject(Context context, YourObject obj){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("YOUR_OBJECT",new Gson().toJson(obj));
editor.commit();
}
public static YourObject getJSONObject (Context context){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String stringobj = preferences.getString("YOUR_OBJECT", "");
if(stringobj.equals(""))return null;
else return new Gson().fromJson(stringobj, YourObject.class);
}
答案 2 :(得分:1)
您可以使用gson库(https://code.google.com/p/google-gson/)将json对象转换为String。
用法:
(Serialization)
UserInfo obj = new UserInfo();
Gson gson = new Gson();
String json = gson.toJson(obj);
==> json is {"value1":1,"value2":"abc"}
您可以将json字符串保存在SharedPreferences中。 稍后,为了取回json对象,请执行反序列化。
(Deserialization)
UserInfo user = gson.fromJson(json, UserInfo.class);
==> user is just like obj
希望这有帮助。
答案 3 :(得分:0)
使用sqlite存储信息。
OR
将JSONObject写入手机内存中的文件中。
答案 4 :(得分:0)
尽量不要将您的JSON存储在SharedPreferences中 - SharedPreferences不是为存储少量数据而设计的,而且读取速度相对较慢。
您可以做的最好的事情是将JSON存储在私有文件中并从该文件中读取。您可以通过执行以下操作(从Android开发人员文档中获取)来创建JSON并将其写入私有文件:
String FILENAME = "hello_file";
String json = my_json_data.toString();
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(json.getBytes());
fos.close();
您可以通过调用openFileInput()
并传入FILENAME
来阅读此文件。
答案 5 :(得分:0)
将JSONObject
存储为字符串。
创建另一个键
public static final String KEY_JSON = "user_json";
修改您的createLoginSession
方法
public void createLoginSession(String email, JSONObject user_data){
// Storing login value as TRUE
editor.putBoolean(IS_LOGIN, true);
// Storing email in pref
editor.putString(KEY_EMAIL, email);
// I WANTED TO STORE THE JSON HERE AFTER PASSING IT AS A PARAMETER
// IN THE METHOD
editor.putString(KEY_JSON, user_data.toString());
// commit changes
editor.commit();
}
我希望有所帮助。