数据持久化
关于SharedPreferences:
1. 一种轻型数据存储方式;
2. 基于XML文件存储(Key-Value)键值对数据;
3. 只能获取数据,存储与修改需要通过Editor对象实现;
4. 数据是可一直保存,不随程序关闭而消失。
与SQLite数据库相比:
优点:不需创建数据库、创建表、以及写SQL语句等。
缺点:1. 仅支持部分数据类型——boolean, int, float, long, String;
2. 只是存储方式的一种补充,不支持条件查询,所以不能完全替代SQLite数据库等其他数据存储方式。
效果图:
首先,定义键 KEY;
存储数据:定义 Editor ,调用editor.putString(key,value)方法来存储,并需要提交一下 editor.commit();
读取数据:定义 SharedPreferences ,调用 preferences.getString(key, string)方法获取键对应的数据,若没有值,则返回string值;
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private EditText et;
private TextView textView;
String KEY = "MyValue";
SharedPreferences preferences;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
preferences = getPreferences(Activity.MODE_PRIVATE);
editor = preferences.edit();
//读取数据
findViewById(R.id.btn_read).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String in = preferences.getString(KEY, "当前数值不存在");//若键KEY没有值存在,则显示提供的值
textView.setText(in);
Toast.makeText(getApplicationContext(), in, Toast.LENGTH_SHORT).show();
}
});
//写入数据
findViewById(R.id.btn_write).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//将值放入editor中
editor.putString(KEY, et.getText().toString());
//将editor值放入首选项中
if (editor.commit()) {
Toast.makeText(getApplicationContext(), "写入成功", Toast.LENGTH_SHORT).show();
}
//清除数据
// editor.clear();
// editor.commit();
//移除键对应的值
// editor.remove(KEY);
// editor.commit();
}
});
}
}
Editor 还有 clear()、remove(key) 等处理方法,这里必须要 commit() 一下才能够实现功能。
PreferenceActivity
一般有:
CheckBoxPreference——on,off
ListPreference——列表选择
EditTextPreference——dialog输入
这里实例化几种常见的类,并且在 EditTextPreference 中实时监听改变 summary。
效果图:
布局文件设置
在res下新建xml目录,新建mypreference.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="checkbox"
android:summaryOff="已经关闭"
android:summaryOn="已经开启"
android:title="是否开启" />
<ListPreference
android:entries="@array/entries"
android:entryValues="@array/values"
android:key="list"
android:summary="请点击选择"
android:title="选择一个选项" />
<EditTextPreference
android:dialogMessage="有劳了"
android:dialogTitle="请输入姓名"
android:key="edittext"
android:summary="在此输入"
android:title="请输入" />
</PreferenceScreen>
对于 ListPreference,在 value 目录下设置布局,新建 mylistpreference.xml:
"entries"为各个选项,"values"为选项对应的值
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="entries">
<item>China</item>
<item>America</item>
<item>England</item>
</string-array>
<string-array name="values">
<item>Asia</item>
<item>Northern America</item>
<item>Europe</item>
</string-array>
</resources>
接下来,MyPreferenceActivity 继承自 PreferenceActivity:
显示界面布局
创建管理器 PreferenceManager;
对于 CheckBoxPreference,manager.findPreference(key),isChecked();
对于 ListPreference,getEntry(),getValue();
对于 EditTextPreference,getText(),setSummary(...),使用监听器 setOnPreferenceChangeListener();
public class MyPreferenceActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
PreferenceManager manager;
CheckBoxPreference checkBoxPreference;
ListPreference listPreference;
EditTextPreference editTextPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//显示界面布局
addPreferencesFromResource(R.xml.mypreference);
manager = getPreferenceManager();
checkBoxPreference = (CheckBoxPreference) manager.findPreference("checkbox");//对应的key
Toast.makeText(getApplicationContext(), "当前状态为:" + checkBoxPreference.isChecked(), Toast.LENGTH_SHORT).show();
listPreference = (ListPreference) manager.findPreference("list");
Toast.makeText(getApplicationContext(), listPreference.getEntry() + " 所在洲:" + listPreference.getValue(), Toast.LENGTH_SHORT).show();
editTextPreference = (EditTextPreference) manager.findPreference("edittext");
//summary中显示输入的文字
editTextPreference.setSummary(editTextPreference.getText());
//事实监听,动态改变summary
editTextPreference.setOnPreferenceChangeListener(this);
Toast.makeText(getApplicationContext(), "输入的姓名为:" + editTextPreference.getText(), Toast.LENGTH_SHORT).show();
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
editTextPreference.setSummary(newValue.toString());
return true;
}
}
这里的布局也可以用多个 PreferenceCategory 构成:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="First Category">
<ListPreference
...... />
</PreferenceCategory>
<PreferenceCategory android:title="Second Category">
<EditTextPreference
android:key="edittext1"
....... />
<CheckBoxPreference
...... />
<EditTextPreference
...... />
</PreferenceCategory>
</PreferenceScreen>
从PreferenceActivity删除一个Preference :
1. 仅删除其中某个 Preference:
EditTextPreference etp = findPreference("edittext1");
((PreferenceGroup) findPreference("Second Category")).removePreference(etp);
2. 删除整个 PreferenceCategory:
((PreferenceGroup) findPreference("Second Category")).removeAll();
具体代码点击