首页 > 代码库 > 安卓实训第十天:利用SharedPreferences来实现数据的保存和读取,以及实现手机电话备份,XMLserializer

安卓实训第十天:利用SharedPreferences来实现数据的保存和读取,以及实现手机电话备份,XMLserializer

一、利用SharedPreferences来实现数据的保存和读取:

1、Mainactivity:

package com.example.sharedpreferencesdemo;

import com.example.sharedpreferencesdemo.util.SharedPreferencesUtil;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText et_name, et_pass;
	private CheckBox chbx_rem;

	private String fileName = "csdn";

	private SharedPreferencesUtil spUtil;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		et_name = (EditText) findViewById(R.id.et_name);
		et_pass = (EditText) findViewById(R.id.et_pass);
		chbx_rem = (CheckBox) findViewById(R.id.chbx_rem);
		// 实例化参数设置的工具类
		spUtil = new SharedPreferencesUtil(this);

		// 操作
		initEditTextData();

	}

	/**
	 * 初始化控件的默认值
	 */
	private void initEditTextData() {
		// 获取参数设置对象
		SharedPreferences sp = this.getSharedPreferences(fileName,
				Context.MODE_PRIVATE);
		// 根据key值获取对应的value值
		String userName = sp.getString("name", "缺省值");
		String userPass = sp.getString("pass", "缺省值");
		// 设置控件的默认值
		et_name.setText(userName);
		et_pass.setText(userPass);
	}

	public void login(View v) {
		final String userName = et_name.getText().toString();
		final String userPass = et_pass.getText().toString();

		if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
			Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_LONG).show();
		} else {
			if (chbx_rem.isChecked()) {
				// 保存操作
				spUtil.save(fileName, Context.MODE_PRIVATE, userName, userPass);

				// 登陆验证

				// 登陆成功
				Intent intent = new Intent();
				intent.setClass(this, SuccessActivity.class);
				startActivity(intent);

			} else {
				new AlertDialog.Builder(this)
						.setMessage("请勾选上记住密码,方便下次登陆")
						.setNegativeButton("否", new DialogInterface.OnClickListener() {
							
							@Override
							public void onClick(DialogInterface dialog, int which) {
								
								//登陆验证
								
						
								// 登陆成功
								Intent intent = new Intent();
								intent.setClass(MainActivity.this, SuccessActivity.class);
								startActivity(intent);
								
							}
						})
						.setPositiveButton("是",
								new DialogInterface.OnClickListener() {

									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										chbx_rem.setChecked(true);// 设置勾选密码
										// 保存操作
										spUtil.save(fileName,
												Context.MODE_PRIVATE, userName,
												userPass);
									}
								}).create().show();
			}

		}

	}
}


2、sharedpreferencesdemo方法的实现:

package com.example.sharedpreferencesdemo.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

import com.example.sharedpreferencesdemo.MainActivity;

public class SharedPreferencesUtil {

	private Context context;

	/**
	 * 构造函数
	 * 
	 * @param context
	 *            :传递过来上下文对象
	 */
	public SharedPreferencesUtil(Context context) {
		this.context = context;
	}

	/**
	 * 保存操作
	 * 
	 * @param fileName
	 *            :文件名称
	 * @param mode
	 *            :文件模式
	 * @param userName
	 *            :用户名
	 * @param userPass
	 *            :密码
	 */
	public void save(String fileName, int mode, String userName, String userPass) {
		SharedPreferences sp = context.getSharedPreferences(fileName, mode);

		Editor editor = sp.edit();
		editor.putString("name", userName);
		editor.putString("pass", userPass);
		editor.commit();
	}

	/**
	 * 保存操作
	 * 
	 * @param mode
	 *            :文件模式
	 * @param userName
	 *            :用户名
	 * @param userPass
	 *            :密码
	 */
	public void save(int mode, String userName, String userPass) {
		MainActivity activity = (MainActivity) context; // 上下文对象,造型为MainActivity的对象、
		//默认是采用的类名进行保存文件的
		SharedPreferences sp = activity.getPreferences(mode);
		Editor editor = sp.edit();
		editor.putString("name", userName);
		editor.putString("pass", userPass);
		editor.commit();
	}

	

}

思考:

	
	//Java中 方法的重载与方法的重写(覆盖)有什么区别

方法重载是指方法名和方法的返回类型都相同,但方法参数不一样.

参数不一样体现在参数个数和参数类型不一样.

方法重写:

方法重写是相对继承而言的.

重写的方法名.返回类型,参数类型和参数个数都要求和父类中的一样.这是重载和重写形式上的区别.

当类继承某个类的时候 .一些属性和方法也被继承过来了.这样就可以用子类对象调用父类中的某个方法.但如果你对父类中的方法不满意,便可以对父类中的方法进行重写.实现你想要的功能!!!

二、利用XMLserializer实现手机电话备份,包括生成XML文件人,然后并读取出来


首先创建一个User类,封装一些实体信息:

package www.example.domain;

import java.io.Serializable;

/**
 * 
 <users> <user> <name>陈红均1</name> <phone>15631293221</phone>
 * <email>redarmy.chen@qq.com</email> <address>保定市职大路,东风东路991</addres> </user>
 * </users>
 * 
 * @author jun
 * 
 */
public class User implements Serializable {

	private String name;// 姓名
	private String phone;// 电话
	private String email;// 邮箱
	private String address;// 住址

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String name, String phone, String email, String address) {
		super();
		this.name = name;
		this.phone = phone;
		this.email = email;
		this.address = address;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

}

再来一个UserService来创建联系人的信息:


package com.example.service;

import java.util.ArrayList;
import java.util.List;

import www.example.domain.User;

public class UserService {

	
	public List<User> findAll(){
		//声明返回对象
		List<User> users = new ArrayList<User>();
		
		  //模拟9个人信息
		  for(int i=1;i<=9;i++){
			   User user = new User("陈红均"+i, "1563129322"+i, "redarmy.chen@qq.com", "保定市职大路1号,东风东路99"+i);
			   users.add(user);
		  }
		//记得修改返回值
		return users;
	}
}

然后主要操作在MainActivity上进行:

package com.example.activityf;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import www.example.domain.User;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Toast;

import com.example.service.UserService;

public class MainActivity extends Activity {

	private UserService userService;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		userService = new UserService();
	}

	/**
	 * 检测你的外部存储设备是否安装,并且是否可读和可写
	 * 
	 * @return
	 */
	public boolean isExternalStorageAvailable() {
		// 声明返回的变量
		boolean flag = false;
		// 获取设备的状态
		String state = Environment.getExternalStorageState();
		// 判断设备是否安装,并且是否可读和可写
		if (Environment.MEDIA_MOUNTED.equals(state)) {
			// 返回真
			flag = true;
		}
		// 记得修改返回变量
		return flag;
	}

	/**
	 * 备份手机信息的操作
	 * 
	 * @param v
	 */
	public void copyPhoneInfo(View v) {
		// 获取所有的联系人信息
		List<User> users = userService.findAll();
		// 写成xml文件
		StringBuffer sb = new StringBuffer();

		// 把要写入的内容 用这个sb来封装
		sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
		sb.append("<users>");
		for (User u : users) {
			sb.append("<user>");
			sb.append("<name>");
			sb.append(u.getName());
			sb.append("</name>");
			sb.append("<phone>");
			sb.append(u.getPhone());
			sb.append("</phone>");
			sb.append("<email>");
			sb.append(u.getEmail());
			sb.append("</email>");
			sb.append("<address>");
			sb.append(u.getAddress());
			sb.append("</address>");
			sb.append("</user>");
		}
		sb.append("</users>");

		// 检测sdcard状态
		if (isExternalStorageAvailable()) {
			// 创建保存的文件对象
			File file = new File(Environment.getExternalStorageDirectory(),
					"phone.xml");

			try {
				// 根据保存的文件,创建文件的输出流对象
				FileOutputStream fos = new FileOutputStream(file);
				// 写入数据
				fos.write(sb.toString().getBytes());
				// 立即写入
				fos.flush();
				// 关闭操作
				fos.close();
				Toast.makeText(this, "数据备份成功", Toast.LENGTH_LONG).show();
			} catch (IOException e) {
				e.printStackTrace();
			}

		} else {
			Toast.makeText(this, "数据无法备份(请检查你的SDCard)", Toast.LENGTH_LONG)
					.show();
		}

	}
}