二、SharedPreference和XML

##二、SharedPreference和XML##

  • SharedPreference
    适合存储零散的数据,例如登录账户及密码等。

    使用方法:

      //取值
      mprefs=getSharedPreferences("config", MODE_PRIVATE);
      boolean configed=mprefs.getBoolean("configed", false);//false为默认值
    
      //存值
      SharedPreferences mpref;
    
      mpref=getSharedPreferences("config", MODE_PRIVATE);
      mpref.edit().putBoolean("configed", true).commit();
    
  • XML: XML文件可以用SAX、DOM或者pull解析

    • SAX是一个解析速度快且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否是合法XML语法中的某部分,如果符合就会触发事件。所谓事件就是一些方法的调用。

      SAX支持已内置到JDK1.5中,无需添加任何的jar文件。
      具体使用方法可参考自定义文档:数据的存储于访问:文件方式数据:用SAX对xml数据解析

    • DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后容许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码开起来比较直观,并且在编码方面比基于SAX的实现更加简单。但是DOM解析对内存消耗比较大,对于Android移动设备,内存资源比较宝贵,建议使用SAX解析。同样Android自带DOM解析。

    • Android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。下面以短信还原为例介绍Pull解析器。

    往XML中写数据:

      /**
      * 备份用户的短信
      * @param context
      * @param pd
      * @throws Exception
      */
      public static void backupSms(Context context,BackUpCallBack callback) throws Exception{
      
      	//如果短信非常多(成千上万条)的话,备份短信耗时较长,则不应当写到主线程
      
      	ContentResolver resolver=context.getContentResolver();
      	File file = new File(Environment.getExternalStorageDirectory(), "backup.xml");
      	FileOutputStream fos=new FileOutputStream(file);
    
      	//XML序列化器
      	serializer = Xml.newSerializer();
    
      	//把短信序列化到sd卡然后设置编码格式
      	serializer.setOutput(fos, "utf-8");
    
      	//第二个参数standalone表示当前的xml是否是独立文件 ture表示文件独立。
      	serializer.startDocument("utf-8", true);
    
      	//设置开始的节点 第一个参数是命名空间。第二个参数是节点的名字
      	serializer.startTag(null, "smss");
    
      	//设置smss节点上面的属性值 第二个参数是名字。第三个参数是值
      	serializer.attribute(null, "size", String.valueOf(count));
    
      	Uri uri=Uri.parse("content://sms/");
      	Cursor cursor=resolver.query(uri, new String[]{"body","address","type","date"}, null, null, null);
      
      	int max=cursor.getCount();
      	//pd.setMax(max);
      	int progress=0;
      	callback.beforeBackUp(max);
      
      	while(cursor.moveToNext()){
      		String body=cursor.getString(0);
      		String address=cursor.getString(1);
      		String type=cursor.getString(2);
      		String date=cursor.getString(3);
      		
      		//第三步
      		serializer.startTag(null, "sms");
      	
      		//第四步
      		serializer.startTag(null, "body");
      		/**
      		 * 加密:第一个参数表示加密种子(密钥)
      		 *     第二个参数表示加密的内容
      		 */
      		serializer.text(Crypto.encrypt("123", cursor.getString(3)));
    
      		//serializer.text(body);
      		serializer.endTag(null, "body");
      		
      		serializer.startTag(null, "address");
      		serializer.text(address);
      		serializer.endTag(null, "address");
      	
      		serializer.startTag(null, "type");
      		serializer.text(type);
      		serializer.endTag(null, "type");
      	
      		serializer.startTag(null, "date");
      		serializer.text(date);
      		serializer.endTag(null, "date");
      	
      		serializer.endTag(null, "sms");
      		progress++;
      		//pd.setProgress(progress);
      		callback.onBackUp(progress);
      	}
      	//第五步
      	serializer.endTag(null, "smss");
      	serializer.endDocument();
      	fos.close();
      }
    

    从XML中读数据:

      /**
      * 还原短信
      * @param context
      * @param flag
      * @throws Exception 
      */
      public static void restoreSms(Context context,boolean flag) throws 	Exception{
      
      	Uri url=Uri.parse("content://sms/");
      	if(flag){
      		context.getContentResolver().delete(url, null, null);
      	}
      
      	//读取短信上的xml文件
      	File file = new File(Environment.getExternalStorageDirectory(), "backup.xml");
      	FileInputStream fis=new FileInputStream(file);
    
      	//XML的pull解析器
      	parser=Xml.newPullParser();
    
      	parser.setInput(fis, "utf-8");
    
      	int eventType=parser.getEventType();
      	/**事件类型主要有五种
      	 * START_DOCUMENT:xml头的事件类型
      	 * END_DOCUMENT:xml尾的事件类型
      	 * START_TAG:开始节点的事件类型
      	 * END_TAG:结束节点的事件类型
      	 * TEXT:文本节点的事件类型
      	 * /
      	 
      	while(eventType != XmlPullParser.END_DOCUMENT){
      		switch(eventType){
      		case XmlPullParser.START_TAG:
      			if("smss".equals(parser.getName())){
      				smssinfo=new ArrayList<Message>();
      			}else if("sms".equals(parser.getName())){
      				message = new Message();
      			}else if("body".equals(parser.getName())){
      				String body=parser.nextText();
      				message.setBody(body);
      			}else if("address".equals(parser.getName())){
      				String address=parser.nextText();
      				message.setBody(address);
      			}else if("type".equals(parser.getName())){
      				String type=parser.nextText();
      				message.setBody(type);
      			}else if("date".equals(parser.getName())){
      				String date=parser.nextText();
      				message.setBody(date);
      			}
      			break;
      		case XmlPullParser.END_TAG:
      			if("sms".equals(parser.getName())){
      				smssinfo.add(message);
      			}else if("smss".equals(parser.getName())){
      				message=null;
      			}
      			break;
      		}
      		eventType = parser.next();
      	}
      
      
      	//把短信插入到系统的短信应用中
      	for(Message message:smssinfo){
      	
      		String body=message.getBody();
      		String address=message.getAddress();
      		String type=message.getType();
      		String date=message.getDate();
      	
      		ContentValues values=new ContentValues();
      		values.put("body", "wo shi duanxin");
      		values.put("address", "138438000");
      		values.put("type", "2");
      		values.put("date", "13950717");
      		context.getContentResolver().insert(url, values);
      	}
    
      }
    
  • 欢迎扫码按关注更多信息
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值