【问题标题】:How to save multiple data using shared preferences?如何使用共享首选项保存多个数据?
【发布时间】:2018-12-27 09:08:41
【问题描述】:

我正在制作一个应用程序,在此活动中,我试图从用户那里获取数据并使用共享首选项保存它。但应用程序在单击注册按钮时崩溃。

这里是 SignUpActivity.java 文件 -

package com.example.abinas.myapplication;

import android.content.Context;
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; 
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class SignUpActivity extends AppCompatActivity {

private EditText e3;
private EditText e4;
private EditText e5;
private EditText e6;
private Button b2;
private RadioGroup rg;
private RadioButton rb;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);
    rg = (RadioGroup)findViewById(R.id.radioroup);
    e3 = (EditText)findViewById(R.id.editText3);
    e4 = (EditText)findViewById(R.id.editText4);
    e5 = (EditText)findViewById(R.id.editText5);
    e6 = (EditText)findViewById(R.id.editText6);
    b2 = (Button)findViewById(R.id.button2);
    int selected_id = rg.getCheckedRadioButtonId();
    rb = (RadioButton)findViewById(selected_id);
}

public void onButtonClick(View view){

    final SharedPreferences pref;
    pref = getSharedPreferences("user_info",Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = pref.edit();
    edit.putString("gender",rb.getText().toString());
    edit.putString("username",e4.getText().toString());
    edit.putString("name",e3.getText().toString());
    edit.putString("password",e5.getText().toString());
    edit.putInt("phone",Integer.parseInt(e6.getText().toString()));
    edit.apply();
    edit.commit();
    //b2.setText("SAVED");
    //b2.setClickable(false);
}
}

应该进行哪些更改才能成功保存数据?

【问题讨论】:

  • 请分享您的堆栈跟踪
  • 你来错地方了。首先查看崩溃日志,然后通过找出崩溃的原因来解决您的问题
  • 请分享 logcat 报告或崩溃报告?
  • 创建一个对象,然后将其转换为json并保存为字符串,然后当您要获取数据时,将json字符串转换为对象-->您将毫无问题地获取数据
  • 似乎有一个错误,当来自单选按钮的字符串存储在共享首选项中时。logcat 中出现以下错误。引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.CharSequence android.widget.RadioButton.getText()”。在注释掉该行时,应用程序正常工作。这个怎么解决????

标签: java android sharedpreferences


【解决方案1】:
 1. Create a public class SharedPreference Manager and a class Keystring that will contain multiple data like name, user name , password, phone number.
 2. Then create object of this class anywhere in the project
 3. Get and put value easily anywhere

SharedPreferenceManager

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;


public class SharedPreferenceManager {

    protected Context mContext;


    protected SharedPreferences mSettings;
    protected Editor mEditor;

    public SharedPreferenceManager(Context ctx, String prefFileName) {
        mContext = ctx;

        mSettings = mContext.getSharedPreferences(prefFileName,
                Context.MODE_PRIVATE);
        mEditor = mSettings.edit();
    }

    /***
     * Set a value for the key
     ****/
    public void setValue(String key, String value) {
        mEditor.putString(key, value);
        mEditor.commit();
    }


    /***
     * Set a value for the key
     ****/
    public void setValue(String key, int value) {
        mEditor.putInt(key, value);
        mEditor.commit();
    }

    /***
     * Set a value for the key
     ****/
    public void setValue(String key, double value) {
        setValue(key, Double.toString(value));
    }

    /***
     * Set a value for the key
     ****/
    public void setValue(String key, long value) {
        mEditor.putLong(key, value);
        mEditor.commit();
    }

    /****
     * Gets the value from the settings stored natively on the device.
     *
     * @param defaultValue Default value for the key, if one is not found.
     **/
    public String getValue(String key, String defaultValue) {
        return mSettings.getString(key, defaultValue);
    }

    public int getIntValue(String key, int defaultValue) {
        return mSettings.getInt(key, defaultValue);
    }

    public long getLongValue(String key, long defaultValue) {
        return mSettings.getLong(key, defaultValue);
    }

    /****
     * Gets the value from the preferences stored natively on the device.
     *
     * @param defValue Default value for the key, if one is not found.
     **/
    public boolean getValue(String key, boolean defValue) {
        return mSettings.getBoolean(key, defValue);
    }

    public void setValue(String key, boolean value) {
        mEditor.putBoolean(key, value);
        mEditor.commit();
    }



    /**
     * Clear all the preferences store in this {@link android.content.SharedPreferences.Editor}
     */
    public boolean clear() {
        try {
            mEditor.clear().commit();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * Removes preference entry for the given key.
     *
     * @param key
     */
    public void removeValue(String key) {
        if (mEditor != null) {
            mEditor.remove(key).commit();
        }
    }
}

钥匙串

public class KeyString {
public static String PREFERENCE_NAME ="APP_PREF";
public static String NAME="NAME";
public static String USER_NAME="USER_NAME";
public static String PHONE_NUMBER="PHONE_NUMBER";
public static String PASSWORD="PASSWORD";
public static String USER_ID="USER_ID";

}

在项目上的任何活动中##

private SharedPreferenceManager preferenceManager=new new SharedPreferenceManager(context, KeyString.PREFERENCE_NAME);

现在设置一些值

preferenceManager.setValue(KeyString.PHONE_NUMBER,"01714262873");

从首选项获取数据

String phoneNumber=preferenceManager.getValue(KeyString.PHONE_NUMBER,""); //default value ""

通过这种方法,您可以设置和获取所需数量的变量和值。只需添加 keyString 和 play.happy 编码..

【讨论】:

    【解决方案2】:

    您的代码同时具有edit.apply()edit.commit()。只使用其中一种。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2011-08-23
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多