在android中使用java 的preferences来保存数据

在android中大家用到的数据存储or读取方式 分为那几种 :
1. sharePreference 
2. sqlite 
3. 直接使用file存储
4. content provider


今天我要介绍的是第五种  ,是java本身自带的util.pres包下的preferences 。

为什么有sharedPreference 还要用Preferences呢?
sharedPreference 一般用来保存一些比较简单的键值对的数据 ,例如登录界面的用户名和密码啊, 一些游戏的积分排名啊等,而这些数据是存储在data/data/package 下面的。没有root权限的手机or平板是无法访问的,而且你也无法通过直接修改生成的xml文档, 来控制你想得到的值,只能通过put和get去修改和获取值。这就是他的缺点。

而 为什么要用到Preferences呢?
是因为因需要修改xml的值或者需要上传或下载这些xml文件,也就是摆脱root权限的限制而去自由控制这些值(而这是有风险的,因为不能担保用户修改完这些值后,不符合格式时xml文件不可读等错误),这就需要手工在代码里监控这些错误发生时要友好地给予处理。
第二个优点是,他同样可以轻松使用get和put方法对键值对进行修改,而且可以指定删除哪一项(使用remove),这就是它有别于用file的原因。

正题,如何使用?

package org.yaoming.testpre;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.prefs.BackingStoreException;
import java.util.prefs.InvalidPreferencesFormatException;
import java.util.prefs.Preferences;


import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;

public class AndroidPreActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String filePath = Environment.getExternalStorageDirectory().getPath()+"/pres/";
        Log.i("AndroidPreActivity", filePath);
        Preferences preferences = Preferences.userNodeForPackage(AndroidPreActivity.class);
		try {
			Preferences.importPreferences(new BufferedInputStream(new FileInputStream(filePath+"test11.xml")));
		} catch (FileNotFoundException e) {
			Log.i("AndroidPreActivity", "找不到文件in");
		} catch (IOException e) {
			Log.i("AndroidPreActivity", "流异常in");
		} catch (InvalidPreferencesFormatException e) {
			Log.i("AndroidPreActivity", "不正确的格式in");
		}
		String v1 = preferences.get("item1", "null");
		String v2 = preferences.get("item2", "null");
		String v3 = preferences.get("item3", "null");
		System.out.println(v1+" "+v2+" "+v3);
		
		preferences.put("item1", "value1");
		preferences.put("item2", "value2");
		preferences.put("item3", "value3");
		
		preferences.put("item4", "new1");
		preferences.put("item5", "new2");
		preferences.put("item6", "new3");
		new File(filePath).mkdirs();
		try {
			preferences.exportNode(new BufferedOutputStream(new FileOutputStream(filePath+"test11.xml")));
		} catch (FileNotFoundException e) {
			Log.i("AndroidPreActivity", "找不到文件out");
		} catch (IOException e) {
			Log.i("AndroidPreActivity", "流异常out");
		} catch (BackingStoreException e) {
			Log.i("AndroidPreActivity", "不正确的格式out");
		}
    }
}
记得在manifest里注册两个权限
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


上面是一个使用的例子 ,运行一次后,你可以在sdcard/pres 的目录下找到该xml文件,如果你的手机或者平板没有安装可以阅读xml的程序,那这个文件就无法打开,也就避免了之前说的用户胡乱修改导致xml不可读的情况,然而这个xml文件是可上传和下载的,这样就可以实时监控到用户的设置数据变化(例如写一个service在后台定时发送数据)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值