【Android开发小记--18】数据存储2--SharedPreferences 以及 PreferenceActivity

数据持久化


关于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();



具体代码点击




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值