少量数据需要持久化的时候,我们用不到数据库保存数据(数据很少,操作数据库效率低下)。Android 给我们提供了使用键值对存储数据的SharedPreferences,也就是说,当保存数据的时候,需要给相应数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences支持多种不同数据类型的存储,如存储的数据类型是整型,那么读出来的数据也是整型,存储的数据是一个字符串,读出来的数据也是一个字符串。下面写个demo来演示一下:
首先是布局文件,三个按钮分别表示存数据,取数据,清除数据:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.myapplication.MainActivity">
<Button
android:id="@+id/saveData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="saveDate" />
<Button
android:id="@+id/getSaveData"
android:layout_below="@id/saveData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="getSaveData" />
<Button
android:id="@+id/clearData"
android:layout_below="@id/getSaveData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="clear" />
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
private Button saveData ,getSaveData ,clearData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = $(R.id.saveData);
getSaveData = $(R.id.getSaveData);
clearData = $(R.id.clearData);
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建名为“data”的文件,加入键值对,保存数据
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","I am a boy ");
//必须commit
editor.commit();
}
});
getSaveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//取出文件中键值对,并提示出来
SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
String name = preferences.getString("name","");
Toast.makeText(MainActivity.this,name,Toast.LENGTH_SHORT).show();
}
});
clearData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.clear();
editor.commit();
}
});
}
public <T extends View> T $(int id) {
return (T) findViewById(id);
}
}
这样做,每次保存数据,取数据,都要commit一下,能不能封装一下呢,更方便的为我们所用呢?下面,我封装一个类,来简易操作这个SharedPreferences:
/**
* Created by dhl on 2016/7/14.
*/
public class SharedPreferencesHelper {
private static SharedPreferencesHelper sharedPreferencesHelper = null;
//单例模式,把Context传进去
public static SharedPreferencesHelper getInstance(Context context) {
if (sharedPreferencesHelper == null) {
synchronized (SharedPreferencesHelper.class) {
if (sharedPreferencesHelper == null) {
sharedPreferencesHelper = new SharedPreferencesHelper();
sharedPreferencesHelper.setContext(context);
return sharedPreferencesHelper;
}
}
}
return sharedPreferencesHelper;
}
private Context context;
public void setContext(Context context) {
this.context = context;
}
//取Boolean 型数据
public boolean getBoolean(String key, boolean defValue) {
try {
return getSP().getBoolean(key, defValue);
} catch (NullPointerException exception) {
Log.d("hcj", "" + exception);
return defValue;
}
}
//存Boolean 型数据
public void putBoolean(String key, boolean value) {
try {
SharedPreferences.Editor editor = getSP().edit();
editor.putBoolean(key, value);
editor.commit();
} catch (NullPointerException exception) {
Log.d("hcj", "" + exception);
}
}
//取Long 型数据
public long getLong(String key, long defValue) {
try {
return getSP().getLong(key, defValue);
} catch (NullPointerException exception) {
Log.d("hcj", "" + exception);
return defValue;
}
}
//存Long 型数据
public void putLong(String key, long value) {
try {
SharedPreferences.Editor editor = getSP().edit();
editor.putLong(key, value);
editor.commit();
} catch (NullPointerException exception) {
Log.d("hcj", "" + exception);
}
}
//取整型
public int getInt(String key, int defaultValue) {
try {
return getSP().getInt(key, defaultValue);
} catch (Exception e) {
Log.d("hcj", "" + e);
return defaultValue;
}
}
//存整型
public void putInt(String key, int value) {
try {
SharedPreferences.Editor editor = getSP().edit();
editor.putInt(key, value);
editor.commit();
} catch (Exception e) {
Log.d("hcj", "" + e);
}
}
//取String
public String getString(String key, String defValue) {
try {
return getSP().getString(key, defValue);
} catch (NullPointerException e) {
Log.d("hcj", "" + e);
return defValue;
}
}
//存String
public void putString(String key, String value) {
try {
SharedPreferences.Editor editor = getSP().edit();
editor.putString(key, value);
editor.commit();
} catch (NullPointerException e) {
Log.d("hcj", "" + e);
}
}
//清除数据
public void clear() {
try {
SharedPreferences.Editor editor = getSP().edit();
editor.clear();
editor.commit();
} catch (NullPointerException e) {
Log.d("hcj", "" + e);
}
}
//获得SharedPreferences对象
private SharedPreferences getSP() {
return context.getSharedPreferences("sp", Context.MODE_PRIVATE);
}
private SharedPreferences getSP(String name) {
return context.getSharedPreferences(name, Context.MODE_PRIVATE);
}
}
MainActivity 代码修改如下:
package com.example.myapplication;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button saveData ,getSaveData ,clearData;
private SharedPreferencesHelper sh ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = $(R.id.saveData);
getSaveData = $(R.id.getSaveData);
clearData = $(R.id.clearData);
sh = SharedPreferencesHelper.getInstance(MainActivity.this);
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/* //创建名为“data”的文件,加入键值对,保存数据
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","I am a boy ");
//必须commit
editor.commit();*/
sh.putString("name","*******");
}
});
getSaveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//取出文件中键值对,并提示出来
SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
String name = preferences.getString("name","");
name = sh.getString("name","");
Toast.makeText(MainActivity.this,name,Toast.LENGTH_SHORT).show();
}
});
clearData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//
/*SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.clear();
editor.commit();*/
sh.clear();
}
});
}
public <T extends View> T $(int id) {
return (T) findViewById(id);
}
}
OK了,总结完毕。