Android SharedPreferences app内部存储方式
小白的学习记录,很多用词可能不太专业,见谅!
安卓开发的时候可以用文件存储的形式,将app的数据保存在app所在的目录下,也就是内部存储,数据只能被app访问,外部没有权限读取这些数据,今天要介绍的SharedPreferences 文件存储方式就是一种
app内部存储。
文件存储的操作无非就是两类文件读取和文件写入,当我们在Activity里面进行存取的操作时,只需要建立SharedPreferences对象,进行相应的操作即可:
如:
SharedPreferences shp=getPreferences(Context.MODE_PRIVATE);//现在基本上都只用private,因为现在只允许app内部访问这个数据文
SharedPreferences.Editor editor=shp.edit();//生成edit对象
editor.putInt("NUMBER",1);//参数1是id,参数2是数值
editor.apply();//这个apply是非同步的可以避免多个线程同时修改一个键值导致冲突
//editor.commit();这个也是提交
需要注意的是,这里面获取shp对象使用的是getPreferences()方法,该方法不用传入文件名,调用这个方法会自动生成一个和activity名相同的文件
当然我们也可以将对数据的操作封装到一个专门操作数据的类,但是在其他类里要想访问activity的全局文件,需要将activity的Context传给这个操作数据的类
如,在类Acitivity里面:
MyData data =new MyData(context:this);
这个this的意思是把整个activity传递到MyData类里面
但是MainActivity会随着程序的运行不断摧毁和重建,会产生多个context,这会导致一个内存的泄露
所以建议使用另一个:
MyData data =new MyData(getApplicationContext());这个applicationContext()指向的是整个app,只会存在一个实例,不会 有内存泄露的问题、
而在对应的MyData类里:
private Context context; //定义一个Context
public MyData(Context context){ //构造函数里作为一个参数传入
this.context=context;
}
public void save(){
//这里为了规范,文件名也需要保存在资源文件里
//需要注意的是,在activity意外的类里面需要用函数先获取activity再获取它的资源,如下
String id=context.getResources().getString(R.string.data_id);
String num_id=context.getResources().getString(R.string.num);
SharedPreferences shp=context.getSharedPreferences(id,Context.MODE_PRIVATE);
SharedPreferences.Editor editor=shp.edit();
editor.putInt(num_id,number);
}
这里需要注意的是,文件名和键的名称也需要规范化,加入到资源文件去,在调用时这样写:
String name=context.getResources().getString(R.string.id);
总结:对数据操作进行封装时,需要在Activity类里面将context作为参数传入到特定的类,给予该类访问app全局文件的权力,
该类中也需要写好对应的构造函数,进行对应的文件操作。