JBOSS 點(diǎn)滴

          豐豐的博客

          SharedPreferences存儲和讀取數(shù)據(jù)

          轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_4f1c99de0101hur1.html
          除了SQLite數(shù)據(jù)庫外,SharedPreferences也是一種輕型的數(shù)據(jù)存儲方式,它的本質(zhì)是基于XML文件存儲key-value鍵值對數(shù)據(jù),通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能獲取數(shù)據(jù)而不支持存儲和修改,存儲修改是通過Editor對象實(shí)現(xiàn)。實(shí)現(xiàn)SharedPreferences存儲的步驟如下:

            一、根據(jù)Context獲取SharedPreferences對象

            二、利用edit()方法獲取Editor對象。

            三、通過Editor對象存儲key-value鍵值對數(shù)據(jù)。

            四、通過commit()方法提交數(shù)據(jù)。

            具體實(shí)現(xiàn)代碼如下:

          public class MainActivity extends Activity {
               @Override
               public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                 
                  //獲取SharedPreferences對象
                  Context ctx = MainActivity.this;      
                  SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
                  //存入數(shù)據(jù)
                  Editor editor = sp.edit();
                  editor.putString("STRING_KEY", "string");
                  editor.putInt("INT_KEY", 0);
                  editor.putBoolean("BOOLEAN_KEY", true);
                  editor.commit();
                 
                  //返回STRING_KEY的值
                  Log.d("SP", sp.getString("STRING_KEY", "none"));
                  //如果NOT_EXIST不存在,則返回值為"none"
                  Log.d("SP", sp.getString("NOT_EXIST", "none"));
               }
           }

           

            這段代碼執(zhí)行過后,即在/data/data/com.test/shared_prefs目錄下生成了一個(gè)SP.xml文件,一個(gè)應(yīng)用可以創(chuàng)建多個(gè)這樣的xml文件。如圖所示: 

             SP.xml文件的具體內(nèi)容如下:

          1 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
          2 <map>
          3 <string name="STRING_KEY">string</string>
          4 <int name="INT_KEY" value="0" />
          5 <boolean name="BOOLEAN_KEY" value="true" />
          6 </map>
           在程序代碼中,通過getXXX方法,可以方便的獲得對應(yīng)Key的Value值,如果key值錯(cuò)誤或者此key無對應(yīng)value值,SharedPreferences提供了一個(gè)賦予默認(rèn)值的機(jī)會,以此保證程序的健壯性。如下圖運(yùn)行結(jié)果中因?yàn)椴o值為"NOT_EXIST"的Key,所以Log打印出的是其默認(rèn)值:“none”。在訪問一個(gè)不存在key值這個(gè)過程中,并無任何異常拋出。  



            SharedPreferences對象與SQLite數(shù)據(jù)庫相比,免去了創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數(shù)據(jù)類型,比如其無法進(jìn)行條件查詢等。所以不論SharedPreferences的數(shù)據(jù)存儲操作是如何簡單,它也只能是存儲方式的一種補(bǔ)充,而無法完全替代如SQLite數(shù)據(jù)庫這樣的其他數(shù)據(jù)存儲方式。
            SharedPreferences接口主要負(fù)責(zé)讀取應(yīng)用程序的Preferences數(shù)據(jù),它提供了如下常用方法來訪問SharedPreferences的key_value鍵值對。

             

          SharedPreferences常用的屬性和方法

          方法名稱

          描述

          public abstract boolean contains (String key)

          判斷SharedPreferences是否包含特定key的數(shù)據(jù)

          public abstract SharedPreferences.Editor edit ()

          返回一個(gè)Edit對象用于操作SharedPreferences

          public abstract Map<String, ?> getAll ()

          獲取SharedPreferences數(shù)據(jù)里全部的key-value對

          getXXX(String key,XXX defvlaue)

          獲取SharedPreferences數(shù)據(jù)指定key所對應(yīng)的value,如果該key不存在,返回默認(rèn)值defValue。其中XXX可以是boolean、float、int、long、String等基本類型的值

          由于SharedPreference是一個(gè)接口,而且在這個(gè)接口里并沒有提供寫入數(shù)據(jù)和讀取數(shù)據(jù)的能力。但是在其內(nèi)部有一個(gè)Editor內(nèi)部的接口,Edit這個(gè)接口有一系列的方法用于操作SharedPreference。

          Editor接口的常用方法

          方法名稱

          描述

          public abstract SharedPreferences.Editor clear ()

          清空SharedPreferences里所有的數(shù)據(jù)

          public abstract boolean commit ()

          當(dāng)Editor編輯完成后,調(diào)用該方法可以提交修改,而且必須要調(diào)用這個(gè)數(shù)據(jù)才修改

          public abstract SharedPreferences.Editor putXXX (String key, boolean XXX)

          向SharedPreferences存入指定的key對應(yīng)的數(shù)據(jù),其中XXX可以是boolean、float、int、long、String等基本類型的值

          public abstract SharedPreferences.Editor remove (String key)

          刪除SharedPreferences里指定key對應(yīng)的數(shù)據(jù)項(xiàng)

           

          SharedPreferences是一個(gè)接口,程序是無法創(chuàng)建SharedPreferences實(shí)例的,可以通過Context.getSharedPreferences(String name,int mode)來得到一個(gè)SharedPreferences實(shí)例

          name:是指文件名稱,不需要加后綴.xml,系統(tǒng)會自動為我們添加上。一般這個(gè)文件存儲在/data/data/<package name>/shared_prefs下(這個(gè)面試常問到)

          mode:是指定讀寫方式,其值有三種,分別為:

          Context.MODE_PRIVATE:指定該SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀、寫

          Context.MODE_WORLD_READABLE:指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀,但不能寫

          Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀寫。


          package com.learn.android;
          import android.app.Activity;
          import android.content.SharedPreferences;
          import android.content.SharedPreferences.Editor;
          import android.os.Bundle;
          import android.view.View;
          import android.view.View.OnClickListener;
          import android.widget.Button;
          import android.widget.EditText;

           

          public class SharedPreferences_LearnActivity extends Activity {
           EditText edit1;
           EditText edit2;
           Button write;
           Button read;
           SharedPreferences sp;
           Editor edit;
             
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                  initComponent();
                  //可以讓其他應(yīng)用程序讀取
                  sp = this.getSharedPreferences("preferences",MODE_WORLD_READABLE);
                  edit = sp.edit();
              }

           

           private void initComponent() {
            // TODO Auto-generated method stub
            edit1 = (EditText) this.findViewById(R.id.editText1);
            edit2 = (EditText) this.findViewById(R.id.editText2);
            write = (Button) this.findViewById(R.id.button1);
            read = (Button) this.findViewById(R.id.button2);
            write.setOnClickListener(writeListener);
            read.setOnClickListener(readListener);
           }
           OnClickListener writeListener = new OnClickListener(){

           

            @Override
            public void onClick(View arg0) {
             // TODO Auto-generated method stub
             String name = edit1.getText().toString();
             System.out.println("name="+name);
             edit.putString("name",name);
             int count = sp.getInt("count",0);
             System.out.println("count="+count);
             edit.putInt("count",++count);
             edit.commit();
            }
            
           };
           OnClickListener readListener = new OnClickListener(){

           

            @Override
            public void onClick(View v) {
             // TODO Auto-generated method stub
             String name = sp.getString("name","");
             int count = sp.getInt("count",0);
             edit1.setText(name);
             edit2.setText(count+"");
            }
            
           };
          }
           
          效果圖:

           

          讀寫其他應(yīng)用SharedPreferences

          在有時(shí)的開發(fā)過程中,我們可能要訪問其他的應(yīng)用程序的SharedPreferences,要實(shí)現(xiàn)這樣的功能,我們必須要保證要訪問的那個(gè)應(yīng)用程序的SharedPreferences的訪問權(quán)限要是MODE_WORLD_READABLE,這表明該SharedPreferences可以被其他應(yīng)用程序讀取,如果指定的MODE_WORLD_WRITEABLE表明該SharedPreferences可以被其他應(yīng)用程序讀取寫入其實(shí)現(xiàn)思路如下

          1、  獲得其他應(yīng)用程序?qū)?yīng)的Context

          2、  通過這個(gè)Context得到這個(gè)應(yīng)用程序的SharedPreferences,然后再利用這個(gè)SharedPreferences讀取內(nèi)容

          以上一例的SharedPreference為例。實(shí)現(xiàn)代碼:

          package com.learn.android;

          import android.app.Activity;
          import android.content.Context;
          import android.content.SharedPreferences;
          import android.content.pm.PackageManager.NameNotFoundException;
          import android.view.View;
          import android.view.View.OnClickListener;
          import android.os.Bundle;
          import android.widget.Button;
          import android.widget.TextView;

           

          public class GetOtherSharedPreferencesActivity extends Activity {
           Button button;
           TextView view;
           Context othercontext;
           SharedPreferences sp;
             
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                  button = (Button) this.findViewById(R.id.button1);
                  view = (TextView) this.findViewById(R.id.view);
                  try {
             othercontext = createPackageContext("com.learn.android",
               Context.CONTEXT_IGNORE_SECURITY);
             sp = othercontext.getSharedPreferences("preferences",othercontext.MODE_PRIVATE);
            } catch (NameNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
                  button.setOnClickListener(l);
              }
              OnClickListener l = new OnClickListener(){

           

            @Override
            public void onClick(View v) {
             // TODO Auto-generated method stub
             String name = sp.getString("name","");
             int count = sp.getInt("count",0);
             view.setText("name="+name+"操作次數(shù)="+count);
            }
               
              };
          }

          SharedPreferences的注意事項(xiàng):

          編輯完SharedPreferences一定要記得調(diào)用Editor的commit()方法,否則不會將數(shù)據(jù)寫入到文件里的。

          回顧總結(jié):

          1、  如何得到SharedPreferences

          SharedPreferences preferences=getPreferences(“test”,MODE_PRIVATE);

          2、  如何編輯SharedPreferences

          得到Editor對象實(shí)例

          SharedPreferences.Editor editor=preferences.editor();

          3、  SharedPreferences的存儲位置

          /data/data/<package name>/shared_prefs

           

          http://www.cnblogs.com/wisekingokok/archive/2011/09/16/2177833.html

          http://zjutsoft.iteye.com/blog/1420099

          posted on 2015-05-21 13:14 半導(dǎo)體 閱讀(205) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 玉树县| 大足县| 昌黎县| 竹北市| 大兴区| 奇台县| 辉南县| 墨玉县| 永福县| 龙海市| 信宜市| 梁河县| 麻阳| 西峡县| 绵竹市| 阿克苏市| 盘山县| 辽阳县| 沭阳县| 长岭县| 神池县| 新平| 中方县| 宿松县| 平陆县| 富宁县| 三明市| 白河县| 利辛县| 乌恰县| 东阳市| 黔东| 南昌县| 黔西县| 山西省| 大余县| 尉氏县| 秭归县| 潞西市| 外汇| 鄂托克前旗|