利用反射+SharedPreferences保存数据
SharedPreferences适用于保存少量的数据,比如用户的信息、游戏的进度等等。使用也非常的简单
//得到对象
sharedPreferences=context.getSharedPreferences("APP-name",Context.MODE_PRIVATE);
//存数据
sharedPreferences.edit().putString(key,value).commit();
//取数据
sharedPreferences.getString(key, "默认值");利用Java反射机制,可以动态的根据传入对象的不同,而进行保存。
如下所示,利用反射原理和SharedPreferences实现的数据保存和读取类,对外只公开save和get方法,分别用于存入和读取
public class SPutil {
private SharedPreferences sharedPreferences;
public SPutil(Context context){
this.sharedPreferences=context.getSharedPreferences("APP-name",Context.MODE_PRIVATE);
}
public void save(Object obj,Class c){
Field[] fs = c.getDeclaredFields();
for ( int i = 0 ; i < fs. length ; i++) {
try {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
Object val = f.get(obj); // 得到此属性的值
String type = f.getType().toString(); // 得到此属性的类型
String name = f.getName();// 得到属性的名称
saveByType(type,name,val);//保存
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Object get(Class c){
try {
Object obj = Class.forName(c.getName()).newInstance();
Field[] fs = c.getDeclaredFields();
for ( int i = 0 ; i < fs. length ; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
String type = f.getType().toString(); // 得到此属性的类型
String name = f.getName(); //得到此属性的名称
Object value = this.getByType(type,name);//得到属性的值
f.set(obj,value);//设置此属性的值
}
return obj;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
private Object getByType(String type ,String key){
Object obj=null;
if(type.endsWith("String")){
obj=sharedPreferences.getString(key, null);
}else if(type.endsWith("int")||type.endsWith("Integer")){
obj=sharedPreferences.getInt(key,-100000);
}else if(type.endsWith("boolean")){
obj=sharedPreferences.getBoolean(key,false);
}else if(type.endsWith("Long")||type.endsWith("long")){
obj=sharedPreferences.getLong(key,-10000);
}else if(type.endsWith("Float")||type.endsWith("float")){
obj=sharedPreferences.getFloat(key,-10000);
}
return obj;
}
private void saveByType(String type,String key,Object val){
if(type.endsWith("String")){
sharedPreferences.edit().putString(key,(String)val).commit();
}else if(type.endsWith("int")||type.endsWith("Integer")){
sharedPreferences.edit().putInt(key,(int)val).commit();
}else if(type.endsWith("boolean")){
sharedPreferences.edit().putBoolean(key,(boolean)val).commit();
}else if(type.endsWith("Long")||type.endsWith("long")){
sharedPreferences.edit().putLong(key,(Long)val).commit();
}else if(type.endsWith("Float")||type.endsWith("float")){
sharedPreferences.edit().putFloat(key,(Float)val).commit();
}else{
Log.d("Exception","类型无法识别");
}
}
}
以User类为例,以下是一个简单的User类,包含姓名、年龄、性别、工资、工号五中不同的数据类型。
public class User {
private String name;;
private int age;
private boolean gender;//true男,false女
private float salary;
private long EmployeeID;
public User(){
}
public User(String name, boolean gender, int age, float salary, long employeeID) {
this.name = name;
this.age = age;
this.gender = gender;
this.salary = salary;
EmployeeID = employeeID;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean isGender() {
return gender;
}
public float getSalary() {
return salary;
}
public long getEmployeeID() {
return EmployeeID;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public void setSalary(float salary) {
this.salary = salary;
}
public void setEmployeeID(long employeeID) {
EmployeeID = employeeID;
}
}具体使用方法如下
SPutil sp=new SPutil(this);
//存入
User user=new User("张三",true,18,3000,20162324);
sp.save(user,User.class);
//读取
User uu=(User)sp.get(User.class);
SharedPreferences存在XML文件当中的数据如下
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<long name="EmployeeID" value="20162324" />
<string name="name">张三</string>
<int name="age" value="18" />
<boolean name="gender" value="true" />
<float name="salary" value="3000.0" />
</map>

浙公网安备 33010602011771号