Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android(8)_數據存儲與訪問2_SharedPreferences

android(8)_數據存儲與訪問2_SharedPreferences

編輯:關於Android編程

使用SharedPreferences進行數據存儲
很多時候我們開發的軟件需要向用戶提供軟件參數設置功能,例如我們常用的QQ,用戶可以設置是否允許陌生人添加自己為好友。

對於軟件配置參數的保存,如果是window軟件通常我們會采用ini文件進行保存,如果是j2se應用,我們會采用properties屬性文件或者xml進行保存。如果是Android應用,我們最適合采用什麼方式保存軟件配置參數呢?

Android平台給我們提供了一個SharedPreferences類,它是一個輕量級的存儲類,特別適合用於保存軟件配置參數。

使用SharedPreferences保存數據,其背後是用xml文件存放數據,文件存放在/data/data/<package name>/shared_prefs目錄下:

SharedPreferences sharedPreferences = getSharedPreferences("itcast", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//獲取編輯器
editor.putString("name", "趙雅智博客");
editor.putInt("age", 4);
editor.commit();//提交修改
生成的itcast.xml文件內容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">趙雅智博客</string>
<int name="age" value="4" />
</map>

因為SharedPreferences背後是使用xml文件保存數據,

getSharedPreferences(name,mode)


方法的第一個參數用於指定該文件的名稱,名稱不用帶後綴,後綴會由Android自動加上。
方法的第二個參數指定文件的操作模式

共有四種操作模式,這四種模式前面介紹使用文件方式保存數據時已經講解過。如果希望SharedPreferences背後使用的xml文件能被其他應用讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權限。

另外Activity還提供了另一個getPreferences(mode)方法操作SharedPreferences,這個方法默認使用當前類不帶包名的類名作為文件的名稱。


訪問SharedPreferences中的數據

訪問SharedPreferences中的數據代碼如下:

SharedPreferences sharedPreferences = getSharedPreferences("itcast", Context.MODE_PRIVATE);
//getString()第二個參數為缺省值,如果preference中不存在該key,將返回缺省值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);

如果訪問其他應用中的Preference,前提條件是:該preference創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權限。如:有個<package name>為cn.itcast.action的應用使用下面語句創建了preference。
getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);
其他應用要訪問上面應用的preference,首先需要創建上面應用的Context,然後通過Context 訪問preference ,訪問preference時會在應用所在包下的shared_prefs目錄找到preference :
Context otherAppsContext = createPackageContext("cn.itcast.action", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);

如果不通過創建Context訪問其他應用的preference,可以以讀取xml文件方式直接訪問其他應用preference對應的xml文件,如:

File xmlFile = new File(“/data/data/<package name>/shared_prefs/itcast.xml”);//<package name>應替換成應用的包名

 


實例:login
AndroidManifest.xml
[html] view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.lession03_login" 
    android:versionCode="1" 
    android:versionName="1.0" > 
 
    <uses-sdk 
        android:minSdkVersion="8" 
        android:targetSdkVersion="17" /> 
 
    <application 
        android:allowBackup="true" 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" 
        android:theme="@style/AppTheme" > 
        <activity 
            android:name="com.example.lession03_login.LoginActivity" 
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
    </application> 
 
</manifest> 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lession03_login"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.lession03_login.LoginActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

布局文件
[html] view plaincopyprint?
<LinearLayout 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:orientation="vertical" > 
 
    <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" > 
 
        <TextView 
            android:id="@+id/view_name" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:text="@string/login_name" /> 
 
        <EditText 
            android:id="@+id/edit_name" 
            android:layout_width="0dp" 
            android:layout_height="wrap_content" 
            android:layout_weight="1" 
            android:ems="10" 
            android:inputType="textPersonName" > 
 
            <requestFocus /> 
        </EditText> 
    </LinearLayout> 
 
    <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" > 
 
        <TextView 
            android:id="@+id/view_pass" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:text="@string/login_pass" /> 
 
        <EditText 
            android:id="@+id/edit_pass" 
            android:layout_width="0dp" 
            android:layout_height="wrap_content" 
            android:layout_weight="1" 
            android:ems="10" 
            android:inputType="textPersonName" > 
 
            <requestFocus /> 
        </EditText> 
    </LinearLayout> 
 
        <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" > 
 
        <RadioGroup 
            android:id="@+id/radioGroup1" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:orientation="horizontal" 
            tools:ignore="UselessParent" > 
 
            <RadioButton 
                android:id="@+id/radio_rom" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:checked="true" 
                android:text="@string/login_rom" /> 
 
            <RadioButton 
                android:id="@+id/radio_sp" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@string/login_sp" /> 
 
            <RadioButton 
                android:id="@+id/radio_sd" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@string/login_sd" /> 
        </RadioGroup> 
 
    </LinearLayout> 
    <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" > 
 
        <Button 
            android:id="@+id/button_login" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:text="@string/login_login" /> 
 
        <CheckBox 
            android:id="@+id/check_remember" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_marginLeft="100dp" 
            android:text="@string/login_remember" /> 
    </LinearLayout> 
 
 
 
</LinearLayout> 

<LinearLayout 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:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/view_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login_name" />

        <EditText
            android:id="@+id/edit_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/view_pass"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login_pass" />

        <EditText
            android:id="@+id/edit_pass"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName" >

            <requestFocus />
        </EditText>
    </LinearLayout>

        <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <RadioGroup
            android:id="@+id/radioGroup1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            tools:ignore="UselessParent" >

            <RadioButton
                android:id="@+id/radio_rom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="@string/login_rom" />

            <RadioButton
                android:id="@+id/radio_sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/login_sp" />

            <RadioButton
                android:id="@+id/radio_sd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/login_sd" />
        </RadioGroup>

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/button_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login_login" />

        <CheckBox
            android:id="@+id/check_remember"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="100dp"
            android:text="@string/login_remember" />
    </LinearLayout>

 

</LinearLayout>


strings.xml
[html] view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
 
    <string name="app_name">lession03_login</string> 
    <string name="action_settings">Settings</string> 
    <string name="hello_world">Hello world!</string> 
    <string name="login_name">用戶名</string> 
    <string name="login_pass">密碼</string> 
    <string name="login_login">登陸</string> 
    <string name="login_remember">記住密碼</string> 
    <string name="login_rom">rom存儲</string> 
    <string name="login_sp">sp存儲</string> 
    <string name="login_sd">sd存儲</string> 
 
</resources> 

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">lession03_login</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="login_name">用戶名</string>
    <string name="login_pass">密碼</string>
    <string name="login_login">登陸</string>
    <string name="login_remember">記住密碼</string>
    <string name="login_rom">rom存儲</string>
    <string name="login_sp">sp存儲</string>
    <string name="login_sd">sd存儲</string>

</resources>

 

LoginService.java
[java] view plaincopyprint?
package com.example.lession03_login.service; 
 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
 
public class LoginService { 
 
    // 上下文對象  
    public Context context; 
 
    // 通過上下文對象傳過來  
    public LoginService(Context context) { 
        super(); 
        this.context = context; 
    } 
 
 
    /**
     * 采用sharedPreferences方法
     * 
     * @param name
     * @param pass
     * @param fileName
     * @return
     */ 
    public boolean saveBysp(String name, String pass, String fileName) { 
        // 通過上下文api獲取 sharedPreferences對象  
        SharedPreferences sharedPreferences = context.getSharedPreferences( 
                fileName, Context.MODE_PRIVATE); 
        // 根據 sharedPreferences對象的edit方法返回Editor對象  
        Editor editor = sharedPreferences.edit(); 
        // 存放數據  
        editor.putString("name", name); 
        editor.putString("pass", pass); 
        // 提交  
        return editor.commit(); 
    } 
 

package com.example.lession03_login.service;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class LoginService {

 // 上下文對象
 public Context context;

 // 通過上下文對象傳過來
 public LoginService(Context context) {
  super();
  this.context = context;
 }


 /**
  * 采用sharedPreferences方法
  *
  * @param name
  * @param pass
  * @param fileName
  * @return
  */
 public boolean saveBysp(String name, String pass, String fileName) {
  // 通過上下文api獲取 sharedPreferences對象
  SharedPreferences sharedPreferences = context.getSharedPreferences(
    fileName, Context.MODE_PRIVATE);
  // 根據 sharedPreferences對象的edit方法返回Editor對象
  Editor editor = sharedPreferences.edit();
  // 存放數據
  editor.putString("name", name);
  editor.putString("pass", pass);
  // 提交
  return editor.commit();
 }

}

 

LoginActivity.java
[java] view plaincopyprint?
package com.example.lession03_login; 
 
import com.example.lession03_login.R; 
import com.example.lession03_login.service.LoginService; 
 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.text.TextUtils; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Checkable; 
import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.Toast; 
 
public class LoginActivity extends Activity { 
 
    // 聲明獲取的用戶名和密碼  
    private EditText edit_name, edit_pass; 
    // 聲明登陸按對象  
    private Button btn_login; 
    // 聲明復選框組件對象  
    private Checkable box_remember; 
    // 聲明業務對象  
    private LoginService loginService; 
 
    // 聲明保存方式按鈕  
    private RadioButton radio_rom, radio_sp, radio_sd; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // 設置顯示視圖  
        setContentView(R.layout.activity_login); 
        // 實例化業務對像  
        loginService = new LoginService(this); 
 
        // 根據id名獲取相應組件對象  
        edit_name = (EditText) findViewById(R.id.edit_name); 
        edit_pass = (EditText) findViewById(R.id.edit_pass); 
        btn_login = (Button) findViewById(R.id.button_login); 
        box_remember = (Checkable) findViewById(R.id.check_remember); 
 
        radio_rom = (RadioButton) findViewById(R.id.radio_rom); 
        radio_sp = (RadioButton) findViewById(R.id.radio_sp); 
        radio_sd = (RadioButton) findViewById(R.id.radio_sd); 
 
        // 給按鈕注冊事件  
        btn_login.setOnClickListener(new MyOnclickListener()); 
 
        // 回顯數據  
        SharedPreferences preferences = this.getSharedPreferences("csdn", 
                Context.MODE_PRIVATE); 
        edit_name.setText(preferences.getString("name", "csdn")); 
        edit_pass.setText(preferences.getString("pass", "csdn")); 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.login, menu); 
        return true; 
    } 
 
    // 內部類 有關點擊的處理對象  
    class MyOnclickListener implements View.OnClickListener { 
 
        @Override 
        public void onClick(View v) { 
            int id = v.getId(); 
            switch (id) { 
            case R.id.button_login: 
                // 獲取用戶名密碼  
                String name = edit_name.getText().toString(); 
                String pass = edit_pass.getText().toString(); 
 
                // 判斷用戶名密碼是否為空  
                if (TextUtils.isEmpty(name)) { 
                    Toast.makeText(LoginActivity.this, "用戶名不可 為空", 
                            Toast.LENGTH_LONG).show(); 
                    return; 
 
                } else if (TextUtils.isEmpty(pass)) { 
                    Toast.makeText(LoginActivity.this, " 密碼不可 為空", 
                            Toast.LENGTH_LONG).show(); 
                    return; 
                } else { 
                    // 判斷記住密碼是否被選中  
                    if (box_remember.isChecked()) { 
                        // 進行保存  
                        // 調用業務對象的業務方法  
                        // 如果rom保存方式被選中  
                        if (radio_rom.isChecked()) { 
                            // 如果sp保存方式被選中  
                        } else if (radio_sp.isChecked()) { 
                            boolean flag = loginService.saveBysp(name, pass, 
                                    "csdn"); 
                            if (flag) { 
                                Toast.makeText(LoginActivity.this, "保存成功", 
                                        Toast.LENGTH_LONG).show(); 
                            } else { 
                                Toast.makeText(LoginActivity.this, "保存失敗", 
                                        Toast.LENGTH_LONG).show(); 
                            } 
 
                            // 如果sd保存方式被選中  
                        } else if (radio_sd.isChecked()) { 
 
                        } 
                    } else { 
                        Toast.makeText(LoginActivity.this, "不保存密碼", 
                                Toast.LENGTH_LONG).show(); 
                    } 
                } 
                break; 
 
            default: 
                break; 
            } 
 
        } 
 
    } 
 

package com.example.lession03_login;

import com.example.lession03_login.R;
import com.example.lession03_login.service.LoginService;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Checkable;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;

public class LoginActivity extends Activity {

 // 聲明獲取的用戶名和密碼
 private EditText edit_name, edit_pass;
 // 聲明登陸按對象
 private Button btn_login;
 // 聲明復選框組件對象
 private Checkable box_remember;
 // 聲明業務對象
 private LoginService loginService;

 // 聲明保存方式按鈕
 private RadioButton radio_rom, radio_sp, radio_sd;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // 設置顯示視圖
  setContentView(R.layout.activity_login);
  // 實例化業務對像
  loginService = new LoginService(this);

  // 根據id名獲取相應組件對象
  edit_name = (EditText) findViewById(R.id.edit_name);
  edit_pass = (EditText) findViewById(R.id.edit_pass);
  btn_login = (Button) findViewById(R.id.button_login);
  box_remember = (Checkable) findViewById(R.id.check_remember);

  radio_rom = (RadioButton) findViewById(R.id.radio_rom);
  radio_sp = (RadioButton) findViewById(R.id.radio_sp);
  radio_sd = (RadioButton) findViewById(R.id.radio_sd);

  // 給按鈕注冊事件
  btn_login.setOnClickListener(new MyOnclickListener());

  // 回顯數據
  SharedPreferences preferences = this.getSharedPreferences("csdn",
    Context.MODE_PRIVATE);
  edit_name.setText(preferences.getString("name", "csdn"));
  edit_pass.setText(preferences.getString("pass", "csdn"));
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.login, menu);
  return true;
 }

 // 內部類 有關點擊的處理對象
 class MyOnclickListener implements View.OnClickListener {

  @Override
  public void onClick(View v) {
   int id = v.getId();
   switch (id) {
   case R.id.button_login:
    // 獲取用戶名密碼
    String name = edit_name.getText().toString();
    String pass = edit_pass.getText().toString();

    // 判斷用戶名密碼是否為空
    if (TextUtils.isEmpty(name)) {
     Toast.makeText(LoginActivity.this, "用戶名不可 為空",
       Toast.LENGTH_LONG).show();
     return;

    } else if (TextUtils.isEmpty(pass)) {
     Toast.makeText(LoginActivity.this, " 密碼不可 為空",
       Toast.LENGTH_LONG).show();
     return;
    } else {
     // 判斷記住密碼是否被選中
     if (box_remember.isChecked()) {
      // 進行保存
      // 調用業務對象的業務方法
      // 如果rom保存方式被選中
      if (radio_rom.isChecked()) {
       // 如果sp保存方式被選中
      } else if (radio_sp.isChecked()) {
       boolean flag = loginService.saveBysp(name, pass,
         "csdn");
       if (flag) {
        Toast.makeText(LoginActivity.this, "保存成功",
          Toast.LENGTH_LONG).show();
       } else {
        Toast.makeText(LoginActivity.this, "保存失敗",
          Toast.LENGTH_LONG).show();
       }

       // 如果sd保存方式被選中
      } else if (radio_sd.isChecked()) {

      }
     } else {
      Toast.makeText(LoginActivity.this, "不保存密碼",
        Toast.LENGTH_LONG).show();
     }
    }
    break;

   default:
    break;
   }

  }

 }

}

 \
 

\

 

 


清空用戶名密碼

 

 

\

重新進入

 \
 


自動獲取用戶名密碼

 \
 


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved