在Android开发app过程中,总会有需要存储较多的一些琐碎东西,比如存储CheckBox是否勾选结果,存储临时文件与数据,数据量比较少,但是名目多。这样使用数据库就很麻烦,而且有一种杀鸡用牛刀的感觉。对于这种数据比较好的一种存储方式就是利用SharedPreferences对数据进行存储。也是在开发过程中使用的较为频繁的一种操作。这次文章所描述的就是利用SharedPreferences来对数据进行一定的存储,读取,删除。亲测有效,写这篇文章一是为以后自己使用的时候提供可行参考,二是与各位看官交流,我就是一个新手,于Android开发中就是个小学生,望高手不奢赐教。
简单的说,对于SharedPreferences
存取数据核心代码:
SharedPreferences sp= getSharedPreferences("config",MODE_PRIVATE);//获取实例
SharedPreferences.Editor editor= sp.edit();//获取编辑器
editor.putString("name",name);//存数据
editor.putString("pwd",password);
editor.commit();
读取代码核心代码:
SharedPreferences sharedPreferences=getSharedPreferences("config",MODE_PRIVATE);
String NAME= sharedPreferences.getString("name","");//前一个参数为key值,后一个参数为默认值
String PWD= sharedPreferences.getString("pwd","");
user.setText(NAME);
pass.setText(PWD);
如果只是想知道 SharedPreferences如何使用的看官,到此便可。生成的config.xml文件位于data/data/包名/shared_prefs下面。
以下是我做的一个简单的案例,也总结了一些最近学习的思考,希望看到后面的看官能够多多交流,相互促进嘛。谢谢。
废话不多说,我的开发环境是Android studio3.1。利用真机进行验证结果,真机魅族mx4,(Android 5.1 ,API22)。
为了简洁操作演示,界面写的比较简单,如图:
具体如何布局就不啰嗦了,应该都清楚,有很多布局方案。建议不管app开发简单与否,命名一定要有条理,这个习惯很重要,其一,为之后的开发提供一定的便利性;其二,实际开发过程中代码工程量会很大,而且是合作开发,多为伙伴着想。磨刀不误砍柴工嘛。我一般的命名习惯也是看了一些大神的规则改过来的,如下利用下划线进行不同部分划分:
布局结束就到了绑定控件的时候了,其实开发app说简单也简单,说白了就是三步走,一、布局;二、绑定控件;三、逻辑书写;
在这里开发的过程中有一个小技巧,当控件较多的时候,控件名称太多为减少来回翻看的麻烦,可进行如下操作:
点击这个split就好,就会得到如下结果:
绑定控件便可,小技巧:oncreat方法最好精简,不要什么方法一股脑写在里面,虽然这对电脑来说无差别,但是可阅读性太差。
绑定如下:
public class MainActivity extends AppCompatActivity {
private EditText et_text;
private EditText et_int;
private Button bt_sumbit_text;
private Button bt_delete_text;
private Button bt_sumbit_int;
private Button bt_delete_int;
private CheckBox cb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
}
private void initUI() {
et_text=(EditText)findViewById(R.id.et_text);
et_int=(EditText)findViewById(R.id.et_int);
bt_sumbit_int=(Button)findViewById(R.id.bt_sumbit_int);
bt_delete_int=(Button)findViewById(R.id.bt_delete_int);
bt_sumbit_text=(Button)findViewById(R.id.bt_sumbit_text);
bt_delete_text=(Button)findViewById(R.id.bt_delete_int);
cb=(CheckBox)findViewById(R.id.cb);
}
}
建议,虽然本案例中所牵扯的控件以及逻辑不是很复杂,但是笔者上文说到,代码要力求条理性以及简洁性;在较为复杂的app开发中对于读取 操作临时存储数据有时是很频繁的,所以为追求简洁性,创建class文件整合SharedPreferences所需所有操作。如下只是对应该案例的例子:
public class SpUtil {
private static SharedPreferences sp;
/**
* @param context 山下文
* @param key 提示信息
* @param string 存储值
* 存取string值
*/
public static void putString(Context context,String key,String string){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);//设置config.xml文件,权限为私有
}
sp.edit().putString(key,string).commit();
}
/**
* @param context
* @param key
* @param string 默认值
*/
public static String getString(Context context,String key,String string){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
}
return sp.getString(key,string);
}
/**
* @param context
* @param key
* @param i 输入int值
*/
public static void putInt(Context context,String key,int i){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);//设置config.xml文件,权限为私有
}
sp.edit().putInt(key,i).commit();
}
/**
* @param context
* @param key
* @param i 默认值
* @return
*/
public static int getInt(Context context,String key,int i){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
}
return sp.getInt(key,i);
}
/**
* @param context
* @param key
* @param b 需保存值
*/
public static void putBoolean(Context context,String key,boolean b){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);//设置config.xml文件,权限为私有
}
sp.edit().putBoolean(key,b).commit();
}
/**
* @param context
* @param key
* @param b 默认Boolean值
* @return
*/
public static boolean getBoolean(Context context,String key,boolean b){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
}
return sp.getBoolean(key,b);
}
public static void Remove(Context context,String key){
if (sp==null){
sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
}
sp.edit().remove(key).commit();
}
}
同时为了规划化代码命名,也是为了代码的可读性,再设置class文件进行命名管理:
public class Keyname {
public final static String EDTEXT="edtext";//存储text
public final static String EDINT="edint";//存储int
public final static String CBISCHECK="cbischeck";//存储check值
}
至此前期准备已经全部准备完毕,就可以进行第三步的逻辑操作了:
首先是数据读取并初始化:
private void initData() {
String ettext = SpUtil.getString(getApplicationContext(), Keyname.EDTEXT, "");
int etint = SpUtil.getInt(getApplicationContext(), Keyname.EDINT, 0);
boolean cbischeck = SpUtil.getBoolean(getApplicationContext(), Keyname.CBISCHECK, false);
et_text.setText(ettext);
et_int.setText(etint+"");
cb.setChecked(cbischeck);
}
而后对数据进行存取操作:
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt_sumbit_text:
String ettext = et_text.getText().toString().trim();
SpUtil.putString(getApplicationContext(),Keyname.EDTEXT,ettext);
break;
case R.id.bt_delete_text:
SpUtil.Remove(getApplicationContext(),Keyname.EDTEXT);
break;
case R.id.bt_sumbit_int:
String etint = et_int.getText().toString().trim();
int i = Integer.parseInt(etint);
SpUtil.putInt(getApplicationContext(),Keyname.EDINT,i);
break;
case R.id.bt_delete_int:
SpUtil.Remove(getApplicationContext(),Keyname.EDINT);
break;
}
}
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
SpUtil.putBoolean(getApplicationContext(),Keyname.CBISCHECK,b);
}
});
至此案例完工,这样退出程序,下次竟然程序的时候也会存储上次操作。main代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText et_text;
private EditText et_int;
private Button bt_sumbit_text;
private Button bt_delete_text;
private Button bt_sumbit_int;
private Button bt_delete_int;
private CheckBox cb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
initData();
}
private void initData() {
String ettext = SpUtil.getString(getApplicationContext(), Keyname.EDTEXT, "");
int etint = SpUtil.getInt(getApplicationContext(), Keyname.EDINT, 0);
boolean cbischeck = SpUtil.getBoolean(getApplicationContext(), Keyname.CBISCHECK, false);
et_text.setText(ettext);
et_int.setText(etint+"");
cb.setChecked(cbischeck);
}
private void initUI() {
et_text=(EditText)findViewById(R.id.et_text);
et_int=(EditText)findViewById(R.id.et_int);
bt_sumbit_int=(Button)findViewById(R.id.bt_sumbit_int);
bt_delete_int=(Button)findViewById(R.id.bt_delete_int);
bt_sumbit_text=(Button)findViewById(R.id.bt_sumbit_text);
bt_delete_text=(Button)findViewById(R.id.bt_delete_text);
cb=(CheckBox)findViewById(R.id.cb);
bt_sumbit_text.setOnClickListener(this);
bt_delete_text.setOnClickListener(this);
bt_sumbit_int.setOnClickListener(this);
bt_delete_int.setOnClickListener(this);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
SpUtil.putBoolean(getApplicationContext(),Keyname.CBISCHECK,b);
}
});
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt_sumbit_text:
String ettext = et_text.getText().toString().trim();
SpUtil.putString(getApplicationContext(),Keyname.EDTEXT,ettext);
break;
case R.id.bt_delete_text:
SpUtil.Remove(getApplicationContext(),Keyname.EDTEXT);
break;
case R.id.bt_sumbit_int:
String etint = et_int.getText().toString().trim();
int i = Integer.parseInt(etint);
SpUtil.putInt(getApplicationContext(),Keyname.EDINT,i);
break;
case R.id.bt_delete_int:
SpUtil.Remove(getApplicationContext(),Keyname.EDINT);
break;
}
}
}
当然,不一定要使用button进行数据提交,edittext有自己的监听器:
et_text.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
还有:
et_text.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
return false;
}
});
用法下次再聊。
对了其生成的xml文件如此data/data下:
总结:
1、Android开发命名规则习惯很重要
2、Android开发代码需注重条理性
3、Android开发需注重简洁性