Android - 在JSON登录时存储有关用户的信息

时间:2014-07-11 07:01:07

标签: java android json sharedpreferences

在我的应用程序中,用户登录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);
   }
}

6 个答案:

答案 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卡内的文件中序列化JSONObjectSharedPreferences并非旨在处理它。但是不要在文件中添加敏感数据。如果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();
   }   

我希望有所帮助。