Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據存儲之SharePreferences的使用總結

Android數據存儲之SharePreferences的使用總結

編輯:關於Android編程

SharedPreferences類供開發人員保存和獲取基本數據類型的鍵值對.該類主要用於基本類型, 例如boolean,float.int,long和string.
SharedPreferences類的數據以xml文件方式存儲在本地
位置://文件存放地址 //data/data/包名/shared_pres
在應用程序結束後,數據仍舊會保存.只要程序沒有被卸載,下次啟動程序後還可以訪問上次存放的數據。
SharedPreferences對象的創建不是通過new出來的,而是getSharedPreferences(String name,int mode)方法可以獲得,這個方法是上下文裡面有的靜態方法,其第一個參數就是共享文件的名稱.第二個參數是文件數據保存的模式。對於使用同一個文件名稱獲得的多個SharedPreferences引用,其指同一個 SharePreferences對象;

文件數據保存的模式:

1)MODE_PRIVATE ,這個模式用得最多,其他的模式很少用

2)MODE_APPEND

3)MODE_WORLD_READABLE

4)MODE_WORLD_WRITEABLE

從SharedPreferences對象中取值時,主要使用該類中定義的getXxx()方法.比如:
String name=share.getString(“name”);

SharedPreferences類中使用的步驟如下:

1)調用SharedPreference對象的edit()方法獲得##SharedPreferences.Editor引用對象

2)調用諸如putBoolean(),putString()等方法增加值.

3)使用commit()方法提交新值. 存儲操作模式有:

SharedPreferences類的應用:

1)判斷用戶是否第一次登錄
2)設置用戶相關默認設置開關
比如默認的聲音設置,是否要消息推送等等。
3)用於設置用戶的自動登錄等等

下面介紹一個模擬可自動登錄的示例程序:
程序功能:
1.驗證用戶名和密碼的正確性;這裡信息都是模擬的.
2.如果勾選記住密碼選框,那麼用戶登錄成功後,再退出程序,兩個輸入框會顯示上次登錄成功過的用戶名和密碼
3.如果勾選自動登錄,頁面啟動時會驗證用戶名和密碼,然後自動登錄。
4.如果沒有勾選記住密碼登錄,那麼如果之前保存的用戶名和密碼也會被移除掉。下次登錄時,用戶名和密碼的輸入框不會有任何的信息。

(一)xml布局文件




    

        
    

    


        
    

    

        

        
    

    

上面的android.support.design.widget.TextInputLayout,是android中的design包裡面的一個定義好布局樣式,相對於垂直方向的線性布局。這裡的包要導包,沒有的話,還是直接用垂直方向的線性布局代替就可以了

(二)Share Preferences的工具類

package com.lwz.sharepreferences;

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

/**
 * 這是一個SharePreference的根據類,使用它可以更方便的數據進行簡單存儲
 * 這裡只要知道基本調用方法就可以了
 * 1.通過構造方法來傳入上下文和文件名
 * 2.通過putValue方法傳入一個或多個自定義的ContentValue對象,進行數據存儲
 * 3.通過get方法來獲取數據
 * 4.通過clear方法來清除這個文件的數據
 * 這裡沒有提供清除單個key的數據,是因為存入相同的數據會自動覆蓋,沒有必要去理會
 */

public class SPHelper {
    //定義一個SharePreference對象
    SharedPreferences sharedPreferences;
    //定義一個上下文對象

    //創建SharePreference對象時要上下文和存儲的模式
    //通過構造方法傳入一個上下文
    SPHelper(Context context, String fileName) {
        //實例化SharePreference對象,使用的是get方法,而不是new創建
        //第一個參數是文件的名字
        //第二個參數是存儲的模式,一般都是使用私有方式:Context.MODE_PRIVATE
        sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
    }

    /**
     * 存儲數據
     * 這裡要對存儲的數據進行判斷在存儲
     * 只能存儲簡單的幾種數據
     * 這裡使用的是自定義的ContentValue類,來進行對多個數據的處理
     */
    //創建一個內部類使用,裡面有key和value這兩個值
    static class ContentValue {
        String key;
        Object value;

        //通過構造方法來傳入key和value
        ContentValue(String key, Object value) {
            this.key = key;
            this.value = value;
        }
    }

    //一次可以傳入多個ContentValue對象的值
    public void putValues(ContentValue... contentValues) {
        //獲取SharePreference對象的編輯對象,才能進行數據的存儲
        SharedPreferences.Editor editor = sharedPreferences.edit();
        //數據分類和存儲
        for (ContentValue contentValue : contentValues) {
            //如果是字符型類型
            if (contentValue.value instanceof String) {
                editor.putString(contentValue.key, contentValue.value.toString()).commit();
            }
            //如果是int類型
            if (contentValue.value instanceof Integer) {
                editor.putInt(contentValue.key, Integer.parseInt(contentValue.value.toString())).commit();
            }
            //如果是Long類型
            if (contentValue.value instanceof Long) {
                editor.putLong(contentValue.key, Long.parseLong(contentValue.value.toString())).commit();
            }
            //如果是布爾類型
            if (contentValue.value instanceof Boolean) {
                editor.putBoolean(contentValue.key, Boolean.parseBoolean(contentValue.value.toString())).commit();
            }

        }
    }


    //獲取數據的方法
    public String getString(String key) {
        return sharedPreferences.getString(key, null);
    }

    public boolean getBoolean(String key) {
        return sharedPreferences.getBoolean(key, false);
    }

    public int getInt(String key) {
        return sharedPreferences.getInt(key, -1);
    }

    public long getLong(String key) {
        return sharedPreferences.getLong(key, -1);
    }

    //清除當前文件的所有的數據
    public void clear() {
        sharedPreferences.edit().clear().commit();
    }

}

(三)主方法的代碼

package com.lwz.sharepreferences;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {

    //定義布局內的控件
    EditText et_username;
    EditText et_password;
    CheckBox cb_remenber;
    CheckBox cb_auto;
    TextView tv_login;

    //判斷是否自動登陸
    boolean isAutoLogin = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //判斷用戶第一次登陸
        idFirstlogin();
        //初始化頁面數據
        initView();

    }

    private void initView() {
        //實例化布局的控件
        et_username = (EditText) findViewById(R.id.main_et_username);
        et_password = (EditText) findViewById(R.id.main_et_password);
        cb_remenber = (CheckBox) findViewById(R.id.main_cb_remember);
        cb_auto = (CheckBox) findViewById(R.id.main_cb_auto);
        tv_login = (TextView) findViewById(R.id.main_tv_login);

        //對用戶登陸界面的處理
        //對登陸按鈕進行監聽
        tv_login.setOnClickListener(this);
        //給兩個選框設置監聽事件
        cb_remenber.setOnCheckedChangeListener(this);
        cb_auto.setOnCheckedChangeListener(this);

        //獲取SharePreference文件數據
        SPHelper helper = new SPHelper(this, "login");
        //判斷用戶是否自動登陸
        isAutoLogin = helper.getBoolean("isAutoLogin");
        //獲取用戶名和密碼
        String name = helper.getString("username");
        String pass = helper.getString("password");
        //如果記錄有用戶名和密碼,把用戶名和密碼放到輸入框中
        if (!TextUtils.isEmpty(name)) {
            et_username.setText(name);
            et_password.setText(pass);
            //選中記住密碼的選框
            cb_remenber.setChecked(true);

        }

        if (isAutoLogin) {
            Toast.makeText(this, name + "自動登陸中。。。", Toast.LENGTH_LONG).show();
            //選中記住密碼的選框
            cb_auto.setChecked(true);
        }


    }

    private void idFirstlogin() {
        //獲取SharedPreferences對象,這個方法沒有使用自定義類的方法來獲取對象
        SharedPreferences sp = getSharedPreferences("set", MODE_PRIVATE);
        //獲取SharedPreferences對象裡面的某一個值
        boolean isfirst = sp.getBoolean("isfirst", true);
        //對這個值進行判斷
        if (isfirst) {
            //如果是第一次登陸,添加登陸過的標記,並顯示第一次登陸
            SharedPreferences.Editor et = sp.edit();
            et.putBoolean("isfirst", false);
            et.commit();
            Toast.makeText(this, "第一次登陸", Toast.LENGTH_SHORT).show();
        }
        //這個方法裡面如果使用自己定義的SPHelper類。代碼如下:
       /* SPHelper helper = new SPHelper(this, "set2");
        boolean isfirt2 = helper.getBoolean("isfirst");
        if (isfirt2) {
            //這裡和上面不同的是要創建一個ContentVa對象
            helper.putValues(new SPHelper.ContentValue("isfirst", false));
            Toast.makeText(this, "第一次登陸", Toast.LENGTH_SHORT).show();
        }*/

    }

    /**
     * 點擊登陸後觸發的方法
     * 這裡要進行各項判斷,比如記住密碼選框和自動登陸選框的選擇情況
     */

    @Override
    public void onClick(View v) {
        //模擬一組數據,要輸入正確的用戶名和密碼123456
        String[] name = {"李文志", "李世民", "李嘉誠", "lili"};
        //獲取用戶輸入的數據
        String username = et_username.getText().toString();
        String password = et_password.getText().toString();
        //判斷非空
        if (TextUtils.isEmpty(username)) {
            Toast.makeText(this, "用戶名不能為空", Toast.LENGTH_SHORT).show();
            return;
        }
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(this, "密碼不能為空", Toast.LENGTH_SHORT).show();
            return;
        }
        //如果用戶名和密碼正確才做相應的動作
        //遍歷每一個用戶名做判斷
        boolean isrightname = false;
        for (int i = 0; i < name.length; i++) {
            if (username.equals(name[i]) && password.equals("123456")) {
                Toast.makeText(this, "恭喜你登陸成功", Toast.LENGTH_LONG).show();
                isrightname = true;
                //下面是數據的相關存儲
                SPHelper helper = new SPHelper(this, "login");

                //如果點擊記住密碼,那麼要保存密碼
                if (cb_remenber.isChecked()) {
                    //保存用戶名
                    helper.putValues(new SPHelper.ContentValue("username", username));
                    //保存密碼
                    helper.putValues(new SPHelper.ContentValue("password", password));
                } else {
                    //清除所有的信息
                    helper.clear();
                }

                //如果點擊了自動登陸,要記住選擇的狀態
                if (cb_auto.isChecked()) {
                    //保存自動登陸的狀態
                    helper.putValues(new SPHelper.ContentValue("isAutoLogin", true));
                } else {
                    helper.putValues(new SPHelper.ContentValue("isAutoLogin", false));
                }
            }

        }
        if (!isrightname) {
            Toast.makeText(this, "用戶名或密碼不正確!", Toast.LENGTH_LONG).show();
        }

    }

    //當選框的狀態發生改變時觸發的方法
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        //當對記住密碼選框操作時
        if (buttonView == cb_remenber) {
            //當取消時,自動登陸也要取消
            if (!isChecked) {
                cb_auto.setChecked(false);
            }
        }

        //當對自動登陸選框操作時        if (buttonView == cb_auto) {
            //當選擇時,記住密碼也要自動去選擇
            if (isChecked) {
                cb_remenber.setChecked(true);
            }
        }

    }
}

其他的功能的各項測試的結果還是比較理想的。
本程序還沒有實現多個用戶名登錄的情況,比如QQ登錄的那種情況,如果要設計那中更能應該使用使用一個ExpandableList View的下拉框來顯示用戶登錄過的用戶名。

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