Android的数据存储之SharedPreferences1

概述:
 

    有些应用需要保存配置信息,如是否打开音效开关,登录时是否保存用户名密码等,Android对这类应用提供了SharedPreferences(共享首选项),SharedPreference适合数量少、数据以key-value类型的保存。

使用步骤:

1、使用Context.getSharedPreferences(String fileName,int mode)方法获取SharedPreferences对象。   

param1:指定SharedPreferences保存、读取的文件名。该文件存放在data/data/packageName/shared_prefs文件夹下。在file-explorer中能找到该文件,默认名:类名.xml。

param2:MODE,权限

   MODE_WORLD_PRIVATE:私有属性,只有本项目才能读取上面Param1指定的XML

   MODE_WORLD_READABLE:运行其他项目读取本项目中的XML。只读

   MODE_WORLD_WRITEABLE:只写

2、获取SharedPreferences.Editor对象

     SharedPreferences.Editor editor = mySharedPreferences.edit();

3、通过使用SharedPreferences.Editor接口的putXxx()保存值

4、通过使用SharedPreferences.Editor.commit方法提交要保存的key-value对。

      注意:commit方法相当于事务中的commit操作,只要在事件结束后进行提交,才会将key-value真正保存在对应的文件中。

	SharedPreferences my = getSharedPreferences("config", MODE_PRIVATE);
			SharedPreferences.Editor editor = my.edit();
			editor.putString("name", "aaa");
			editor.putBoolean("flag", "true");
			editor.commit();

 

 经典问题:

1、使用IO读取SharedPreference

try {
	String path = android.os.Environment.getDataDirectory()
						.getAbsolutePath()
						+ "/data/"
						+ getPackageName()
						+ "/shared_prefs/abc.xml";
        Log.i("TAG", android.os.Environment.getDataDirectory()
						.getAbsolutePath());
// data/data/com.example.test_preferences/shared_prefs/abc.xml
	FileInputStream fis = new FileInputStream(path);
	InputStreamReader isr = new InputStreamReader(fis);
	BufferedReader br = new BufferedReader(isr);
	Toast.makeText(this, br.readLine(), 3000).show();
	fis.close();
} catch (Exception e) {
	e.printStackTrace();
}
 

2、将SharedPreferences数据保存在SD卡上。

  分析SharedPreferences的源码,发现xml默认保存在shared_prefs目录中,但是可以通过JAVA反射来修改。

public void saveSD() {
		try {
			Field field = ContextWrapper.class.getDeclaredField("mBase");
			field.setAccessible(true);
			// 获取mBase变量的值
			Object obj = field.get(this);
			field = obj.getClass().getDeclaredField("mPreferencesDir");
			field.setAccessible(true);
			File file = new File("/sdcard0");
			field.set(obj, file);
			SharedPreferences my = getSharedPreferences("config", MODE_PRIVATE);
			SharedPreferences.Editor editor = my.edit();
			editor.putString("name", "aaa");
			editor.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

3、SharedPreferences保存图像

   分析:原则上SharedPreferences只能将字符串以key-value的形式保存。可以采用编码的方式将任何二进制数据转换成字符串形式,保存在SharedPreferences中。

    最常用的是Base64。因为在保存和存取时需要编码解码,所有不建议保存尺寸太大的图像数据或二进制文件。

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image);
		try {
			btn = (Button) findViewById(R.id.btn_img);
			img = (ImageView) findViewById(R.id.image);
			img2 = (ImageView) findViewById(R.id.image2);
			pref = getSharedPreferences("baseImg", Activity.MODE_PRIVATE);
			String de = pref.getString("imagessss", null);
			if (de != null) {
				byte[] bytes = Base64.decodeBase64(de.getBytes());
				ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
				img2.setImageDrawable(Drawable.createFromStream(bais, "image"));
			}
			btn.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					try {
//						Drawable ddd = getResources().getDrawable(R.drawable.ic_launcher);
//						((BitmapDrawable) ddd).getBitmap();
						ByteArrayOutputStream baos = new ByteArrayOutputStream();
						//把图片压缩到baos字节流中
						((BitmapDrawable) img.getDrawable()).getBitmap()
								.compress(CompressFormat.JPEG, 50, baos);
						//编码过程
						String image = new String(Base64.encodeBase64(baos
								.toByteArray()));
						SharedPreferences.Editor editor = pref.edit();
						editor.putString("imagessss", image);
						editor.commit();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

说明:本文参照李宁老师的《Android高薪之路》

猜你喜欢

转载自lydia-fly.iteye.com/blog/2032657