zoukankan      html  css  js  c++  java
  • Android-SharedPreferences

    SharedPreferences简介
    在Android开发过程中,有时候我们需要保存一些简单的软件配置等简单数据的信息,而如果我们直接用数据库存储的话又不太方便,在这里我们就可以用到SharedPreferences,SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此保存的数据主要是简单类型的键值对(key-value),它保存的是一个XML文件。

    SharedPreferences常用的属性和方法

    方法名称  描述
    public abstract boolean contains (String key)  判断SharedPreferences是否包含特定key的数据
    public abstract SharedPreferences.Editor edit () 返回一个Edit对象用于操作SharedPreferences
    public abstract Map<String, ?> getAll ()  获取SharedPreferences数据里全部的key-value对
    getXXX(String key,XXX defvlaue) 获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值

    由于SharedPreference是一个接口,而且在这个接口里并没有提供写入数据和读取数据的能力。但是在其内部有一个Editor内部的接口,Edit这个接口有一系列的方法用于操作SharedPreference。

    Editor接口的常用方法

    方法名称 描述
    public abstract SharedPreferences.Editor clear () 清空SharedPreferences里所有的数据
    public abstract boolean commit () 当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改
    public abstract SharedPreferences.Editor putXXX (String key, boolean XXX) 向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值
    public abstract SharedPreferences.Editor remove (String key)  删除SharedPreferences里指定key对应的数据项

    SharedPreferences是一个接口,程序是无法创建SharedPreferences实例的,可以通过Context.getSharedPreferences(String name,int mode)来得到一个SharedPreferences实例

    name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。

    一般这个文件存储在/data/data/<package name>/shared_prefs下(这个面试常问到)

    mode:是指定读写方式,其值有三种,分别为:

    Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写

    Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写

    Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。


    SharedPreferences的使用

    SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。

     
        使用SharedPreferences保存key-value对的步骤如下:

      (1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定。

      (2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。

      (3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。

      (4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。

    具体代码的书写流程为:

    A、存放数据信息

    1、打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences

    SharedPreferences settings = getSharedPreferences(“setting”, 0);

    2、让setting处于编辑状态

    SharedPreferences.Editor editor = settings.edit();

    3、存放数据

    editor.putString(“name”,”ATAAW”);
    editor.putString(“URL”,”ATAAW.COM”);

    4、完成提交

    editor.commit();

    B、读取数据信息

    1、获取Preferences

    SharedPreferences settings = getSharedPreferences(“setting”, 0);

    2、取出数据

    String name = settings.getString(“name”,”默认值”);
    String url = setting.getString(“URL”,”default”);

    以上就是Android中SharedPreferences的使用方法,其中创建的Preferences文件存放位置可以在Eclipse中查看:

    DDMS->File Explorer /<package name>/shared_prefs/setting.xml

     下面使用一个登录界面记住密码的例子来说明一下:

    布局文件:login.xml

      1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      2         android:id="@+id/editRel"
      3         android:layout_width="fill_parent"
      4         android:layout_height="wrap_content" >
      5            <RelativeLayout
      6               android:id="@+id/faceImgRel"
      7               android:layout_width="fill_parent"
      8               android:layout_height="wrap_content"
      9               android:layout_marginTop="50dp"
     10               android:gravity="center" >
     11               <ImageView
     12                   android:id="@+id/faceImg"
     13                   android:scaleType="centerInside"
     14                   android:layout_width="90dp"
     15                   android:layout_height="90dp"
     16                   android:contentDescription="@string/faceImgView"
     17                   android:background="@drawable/login_head" />
     18         </RelativeLayout>
     19 
     20         <RelativeLayout
     21             android:id="@+id/accountRel"
     22             android:layout_below="@id/faceImgRel"
     23             android:layout_width="fill_parent"
     24             android:layout_height="wrap_content"
     25             android:layout_marginTop="14dp"
     26             android:clickable="true"
     27             android:gravity="center_vertical" >
     28 
     29             <TextView
     30                 android:id="@+id/account"
     31                 android:padding="20dp"
     32                 android:layout_width="wrap_content"
     33                 android:layout_height="wrap_content"
     34                 android:text="@string/account"
     35                 android:textColor="#0099CC" 
     36                 android:textSize="17sp"/>
     37 
     38             <EditText
     39                 android:id="@+id/username"
     40                 android:layout_width="fill_parent"
     41                 android:layout_height="wrap_content"
     42                 android:layout_centerVertical="true"
     43                 android:textSize="15sp"
     44                 android:layout_marginRight="20dp"
     45                 android:layout_toRightOf="@id/account"
     46                 android:hint="@string/accounthint"
     47                 android:inputType="text" />
     48         </RelativeLayout>
     49 
     50         <RelativeLayout
     51             android:id="@+id/pwdRel"
     52             android:layout_width="fill_parent"
     53             android:layout_height="wrap_content"
     54             android:layout_below="@id/accountRel"
     55             android:clickable="true"
     56             android:gravity="center_vertical" >
     57 
     58             <TextView
     59                 android:id="@+id/pwd"
     60                 android:padding="20dp"
     61                 android:layout_width="wrap_content"
     62                 android:layout_height="wrap_content"
     63                 android:text="@string/pwd"
     64                 android:textColor="#0099cc"
     65                 android:textSize="17sp" />
     66 
     67             <EditText
     68                 android:id="@+id/password"
     69                 android:layout_width="fill_parent"
     70                 android:layout_height="wrap_content"
     71                 android:layout_centerVertical="true"
     72                 android:textSize="15sp"
     73                 android:layout_toRightOf="@id/pwd"
     74                 android:hint="@string/pwd" 
     75                 android:inputType="textPassword"
     76                 android:layout_marginRight="20dp"/>
     77         </RelativeLayout>
     78         <RelativeLayout 
     79             android:id="@+id/btnloginRel"
     80             android:layout_width="fill_parent"
     81             android:layout_height="wrap_content"
     82             android:layout_below="@id/pwdRel"
     83             android:clickable="true"
     84             android:gravity="center_vertical" >
     85             <Button
     86                 android:id="@+id/btnlogin"
     87                 android:layout_width="fill_parent"
     88                 android:layout_height="wrap_content"
     89                 android:layout_margin="20dp"
     90                 android:textColor="#FFFFFF"
     91                 android:layout_centerVertical="true"
     92                 android:background="@drawable/button_background" 
     93                 android:text="@string/login" />
     94         </RelativeLayout>
     95         <RelativeLayout 
     96             android:id="@+id/funcRel"
     97             android:layout_width="fill_parent"
     98             android:layout_height="wrap_content"
     99             android:layout_below="@id/btnloginRel"
    100             android:gravity="center_vertical" >
    101             
    102            
    103            <CheckBox  
    104             android:id="@+id/cb_rempwd"  
    105             android:layout_width="wrap_content"  
    106             android:layout_height="wrap_content"   
    107             android:layout_marginTop="15dip"
    108             android:layout_marginLeft="20dip"  
    109             android:text="@string/rem_pwd"  
    110             android:textColor="#0099cc"
    111                 android:textSize="16sp" />  
    112            
    113            
    114           <!--<TextView
    115                 android:id="@+id/forgetpwd"
    116                 android:layout_width="wrap_content"
    117                 android:layout_height="wrap_content"
    118                 android:layout_marginTop="15dip"
    119                 android:layout_marginLeft="20dip"
    120                 android:text="@string/forget_pwd"
    121                 android:textColor="#0099cc"
    122                 android:textSize="16sp" />
    123                 
    124                   --> 
    125                 
    126            <TextView
    127                 android:id="@+id/register"
    128                 android:clickable="true"
    129                 android:layout_width="wrap_content"
    130                 android:layout_height="wrap_content"
    131                 android:layout_alignParentRight="true"
    132                 android:layout_marginRight="20dip"
    133                 android:layout_marginTop="15dip"
    134                 android:text="@string/register"
    135                 android:textColor="@color/text_color_selector"
    136                 android:background="@drawable/textview_background" 
    137                 android:textSize="16sp" />
    138 
    139         </RelativeLayout>
    140         
    141     </RelativeLayout>
    View Code

    下面在LoginActivity.java文件开始使用SharedPreferences:

    声明:只是使用的实例代码,并不是完整LoginActivity.java的代码,可在需要的地方添加上即可。

     1 public class LoginActivity extends Activity {
     2     private EditText etuser;
     3     private EditText etPass;
     4     private Button login;
     5         private TextView fgPwdTv;
     6     private CheckBox rem_pwdBox;
     7     private SharedPreferences sp;// 保存登录信息
     8     protected void onCreate(Bundle savedInstanceState) {
     9 
    10         super.onCreate(savedInstanceState);
    11         // 去掉窗口标题
    12         requestWindowFeature(Window.FEATURE_NO_TITLE);
    13         setContentView(R.layout.login);
    14         // 忘记密码设置下划线
    15         // fgPwdTv = (TextView)this.findViewById(R.id.forgetpwd);
    16         // fgPwdTv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
    17         etuser = (EditText) findViewById(R.id.username);
    18         etPass = (EditText) findViewById(R.id.password);
    19         login = (Button) findViewById(R.id.btnlogin);
    20         login.setOnClickListener(new LoginListener());
    21         sp = this.getSharedPreferences("userInfo", Activity.MODE_PRIVATE);
    22         rem_pwdBox = (CheckBox) findViewById(R.id.cb_rempwd);
    23 
    24         // 判断记住密码多选框的状态
    25         if (sp.getBoolean("CHECK_PWD", false)) {
    26             // 设置默认是记录密码状态
    27             rem_pwdBox.setChecked(true);
    28             Editor editor = sp.edit();
    29             editor.putBoolean("CHECK_PWD", true);
    30             editor.commit();
    31             etuser.setText(sp.getString("USER_NAME", ""));
    32             etPass.setText(sp.getString("PASSWORD", ""));
    33         }
    34 
    35         rem_pwdBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    36 
    37             @Override
    38             public void onCheckedChanged(CompoundButton buttonView,
    39                     boolean isChecked) {
    40                 // TODO Auto-generated method stub
    41                 if (isChecked) {
    42                     SharedPreferences.Editor edit = sp.edit();
    43                     edit.putBoolean("CHECK_PWD", true);
    44                     edit.putString("USER_NAME", etuser.getText().toString());
    45                     edit.putString("PASSWORD", etPass.getText().toString());
    46                     edit.commit();
    47                 }
    48                 if (!isChecked) {
    49 
    50                     SharedPreferences.Editor edit = sp.edit();
    51                     edit.putBoolean("CHECK_PWD", false);
    52                     edit.putString("USER_NAME", "");
    53                     edit.putString("PASSWORD", "");
    54                     edit.commit();
    55                 }
    56             }
    57         });
    58 
    59     }
    60 
    61     class LoginListener implements OnClickListener {
    62 
    63         /*
    64          * (non-Javadoc)
    65          * 
    66          * @see android.view.View.OnClickListener#onClick(android.view.View)
    67          */
    68         @Override
    69         public void onClick(View v) {
    70 
    71             username = etuser.getText().toString();
    72             // password = SHA1(etPass.getText().toString());
    73             password = etPass.getText().toString();
    74             // 登录成功和记住密码框为选中状态才保存用户信息
    75             if (rem_pwdBox.isChecked()) {
    76                 // 记住用户名、密码、
    77                 Editor editor = sp.edit();
    78                 editor.putBoolean("CHECK_PWD", true);
    79                 editor.putString("USER_NAME", username);
    80                 editor.putString("PASSWORD", password);
    81                 editor.commit();
    82             }   
    83                       ......
    84 
    85     }
    86 }

     而生成的userInfo.xml:

    1 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    2 <map>
    3 <string name="PASSWORD">1234</string>
    4 <boolean name="CHECK_PWD" value="true" />
    5 <string name="USER_NAME">ning</string>
    6 </map>
  • 相关阅读:
    数据类型(列类型-小数型)
    Python全栈开发之2、数据类型-数值、字符串、列表、字典、元组和文件处理
    Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数
    Python全栈开发之1、python基础初识介绍以及安装
    数据类型(列类型)
    中文数据问题
    SQL--数据--基本操作
    SQL--数据表--基本操作
    SQL--数据库--基本操作
    Mysql数据库
  • 原文地址:https://www.cnblogs.com/ning1121/p/3933995.html
Copyright © 2011-2022 走看看