Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-在JSON中存储用户登录时的信息_Java_Android_Json_Sharedpreferences - Fatal编程技术网

Java Android-在JSON中存储用户登录时的信息

Java Android-在JSON中存储用户登录时的信息,java,android,json,sharedpreferences,Java,Android,Json,Sharedpreferences,在我的应用程序中,用户登录到LoginActivity,在此基础上使用我创建的SessionManager类创建登录会话(我在其中有一个SharedReferences对象,我将用户的电子邮件放入,并将布尔值isLoggedIn设置为true) 现在,我真正想做的是在登录时将从服务器LoginActivity中获得的用户JSONObject放入SharedReferences。基本上,我希望能够在用户登录时从应用程序中的任何位置访问JSON文档 但是,我意识到我不能将JSONObject放入编辑

在我的应用程序中,用户登录到
LoginActivity
,在此基础上使用我创建的
SessionManager
类创建登录会话(我在其中有一个
SharedReferences
对象,我
用户的电子邮件放入,并将布尔值
isLoggedIn
设置为true)

现在,我真正想做的是在登录时将从服务器
LoginActivity
中获得的用户
JSONObject
放入
SharedReferences
。基本上,我希望能够在用户登录时从应用程序中的任何位置访问
JSON
文档

但是,我意识到我不能将
JSONObject
放入编辑器。但是,实现我所描述的功能的正确方法是什么

如果相关。。。这是我的
SessionManager
类,其中有一个
SharedReferences
对象(我不知道这是否是最好的方法):

包com.xxx.xxxx;
导入java.util.HashMap;
导入com.xxxx.auth.LoginActivity;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.content.SharedReferences.Editor;
公共类会话管理器{
//共享首选项
共享参考优先;
//共享首选项编辑器
编辑;
//上下文
语境(Context)语境;;
//共享优先模式
int PRIVATE_MODE=0;
//Sharedpref文件名
私有静态最终字符串PREF_NAME=“PREFS”;
//所有共享首选项密钥
私有静态最终字符串是\u LOGIN=“IsLoggedIn”;
//电子邮件地址
公共静态最终字符串键\u EMAIL=“EMAIL”;
//建造师
公共会话管理器(上下文){
这._context=context;
pref=\u context.getSharedReferences(pref\u名称,PRIVATE\u模式);
编辑器=pref.edit();
}
/**创建登录会话*/
public void createLoginSession(字符串电子邮件){
//将登录值存储为TRUE
putBoolean(IS_LOGIN,true);
//在pref中存储电子邮件
编辑器.putString(KEY_EMAIL,EMAIL);
//在将JSON作为参数传递后,我想将其存储在这里
//在方法中
//提交更改
commit();
}   
/**
*获取存储的会话数据
* */
公共HashMap getUserDetails(){
HashMap用户=新建HashMap();
//用户电子邮件id
user.put(KEY_EMAIL,pref.getString(KEY_EMAIL,null));
//返回用户
返回用户;
}
/**
*清除会话详细信息
* */
public void logoutUser(){
//清除共享首选项中的所有数据
编辑器.clear();
commit();
重定向();
}
公共无效重定向(){
//将用户重定向到登录活动
意图i=新意图(_上下文,LoginActivity.class);
//结束所有活动
i、 添加标志(意图、标志、活动、清除、顶部);
//添加新标志以启动新活动
i、 设置标志(意图、标志、活动、新任务);
//启动登录活动
_背景。起始触觉(i);
}
//获取登录状态
公共布尔值isLoggedIn(){
返回pref.getBoolean(是\u登录,false);
}
}

您只能在首选项中存储简单类型。如果确实要保存JSON,请将其另存为字符串,并使用GSON()或其他JSON映射程序对其进行解析。

您只能在首选项中存储简单类型。如果确实要保存JSON,请将其保存为字符串,并使用GSON()或其他JSON映射程序对其进行解析。

使用sqlite存储信息


将JSONObject写入手机存储器中的文件。

使用sqlite存储信息


将JSONObject写入手机内存中的文件。

尽量不要将JSON存储在SharedReferences中-SharedReferences的设计目的不是存储少量数据,读取速度相对较慢

您可以做的最好的事情是将JSON存储在一个私有文件中并从该文件中读取。您可以通过以下操作创建JSON并将其写入私有文件(摘自Android开发者文档):


您可以通过调用
openFileInput()
并传入
FILENAME

来读取此文件,尽量不要将JSON存储在SharedReferences中-SharedReferences的设计目的不是存储少量数据,读取速度相对较慢

您可以做的最好的事情是将JSON存储在一个私有文件中并从该文件中读取。您可以通过以下操作创建JSON并将其写入私有文件(摘自Android开发者文档):


您可以通过调用
openFileInput()
并传入
FILENAME
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

我希望这会有所帮助。

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

我希望这会有所帮助。

您可以在SD卡内的文件中序列化
JSONObject
SharedReferences
不是为处理它而设计的。但不要在文件中添加敏感数据。如果
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);
}

您可以在SD卡内的文件中序列化
JSONObject
SharedReferences
不是为处理它而设计的。但不要在文件中添加敏感数据。如果
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);
}
您可以使用gson库()将json对象与字符串进行转换

用法:

(Serialization)
UserInfo obj = new UserInfo();
Gson gson = new Gson();
String json = gson.toJson(obj);  
==> json is {"value1":1,"value2":"abc"}
您可以将json字符串保存在SharedReferences中。 稍后,要返回json对象,请执行反序列化

(Deserialization)
UserInfo user = gson.fromJson(json, UserInfo.class);   
==> user is just like obj
希望这有帮助。

您可以使用gson库()将json对象转换为
(Deserialization)
UserInfo user = gson.fromJson(json, UserInfo.class);   
==> user is just like obj