android 文件存儲以及SharedPreferences存儲以及模擬記住密碼

1、文件存儲

文件存儲是android最基本的一種數據存儲方式,他不會對存儲的內容進行任何格式化的處理,所有數據都原封不動的保存在文件當中。

1.1 將數據存儲到文件當中

Context類提供了一個openFileOutput()方法,該方法接受兩個參數,第一個是創建的文件名,不可以包含路徑,默認存儲在data/data/<package name>/files/目錄下。第二個參數是文件的操作模式,有兩種可選,MODE_PRIVATE(覆蓋原內容)與MODE_APPEND(在原內容後追加)。該方法返回一個FileOutputStream對象,然後使用java IO流進行存儲。

1.2 從文件中讀取數據

Context類還提供了一個openFileInput()方法,給方法接受一個參數,即要讀取的文件名字,該方法會自動在data/data/<package name>/files/目錄下找到該文件,然後返回一個FIleInputStream對象,使用Java IO進行讀取。


使用例子


界面包含一個輸入框,還有兩個按鈕,一個用來存儲,一個用來讀取,佈局代碼不再給出


存儲的方法

public void save(String fileName, String data) {
		FileOutputStream out = null;
		BufferedWriter writer = null;

		try {
			out = openFileOutput(fileName, Context.MODE_PRIVATE);
			writer = new BufferedWriter(new OutputStreamWriter(out));
			writer.write(data);
			Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_LONG).show();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

讀取的方法

public String read(String fileName) {
		FileInputStream in = null;
		BufferedReader reader = null;
		StringBuilder content = new StringBuilder();

		try {
			in = openFileInput(fileName);
			reader = new BufferedReader(new InputStreamReader(in));
			String line = "";
			while ((line = reader.readLine()) != null) {
				content.append(line);
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return content.toString();
	}

在對按鈕點擊事件作出處理後,運行程序即可看到Toast出來的就是剛纔保存的內容


2、SharedPreferences存儲

SharedPreferences是採用鍵值對的方式存儲數據的,存儲數據的時候需要給該條數據提供一個鍵,然後讀取數據的時候通過這個鍵把數據讀取出來。


2.1 將數據存儲到SharedPreferences中

首先獲得SharedPreferences對象,我們一般通過Context類提供的getSharedPreferences()方法來得到,該方法需要傳遞兩個參數,第一個是指定的文件名稱,如果該文件不存在,會自動創建一個,文件默認存儲在 data/data/<package name>/shared_prefs中,第二個是指定的操作模式,有兩種模式可供選擇,MODE_PRIVATE表示只有當前的應用程序纔可以對文件進行讀寫)和MODE_MULTI_PROCESS(用於多個進程同時對該SharedPreferences文件進行操作的情況)。

得到SharedPreferences對象後的操作

2.1.1  調用SharedPreferences對象的edit()方法來獲得一個SharedPreferences.Editer對象

2.1.2  通過Editer對象添加數據,例如editer,putString(key,value);

2.1.3  調用commit()方法將操作的數據進行提交


2.2 從SharedPreferences中讀取數據

讀取數據相對簡單一些,只需要得到一個SharedPrefences對象,然後調用它的一系列get()方法就可以得到相應的數據了。


使用例子



界面包含一個姓名輸入框和一個年齡輸入框,一個保存按鈕,一個讀取按鈕。佈局代碼不再給出

處理代碼

public class SecondActivity extends BaseActivity implements OnClickListener {

	private Button mReadButton;
	private Button mSaveButton;
	private EditText mNameEditText;
	private EditText mAgeEditText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_second);
	}

	@Override
	public void findId() {
		mReadButton = (Button) findViewById(R.id.second_read_Button);
		mSaveButton = (Button) findViewById(R.id.second_save_Button);
		mNameEditText = (EditText) findViewById(R.id.second_nameEditText);
		mAgeEditText = (EditText) findViewById(R.id.second_age_EditText);
	}

	@Override
	public void setListener() {
		mReadButton.setOnClickListener(this);
		mSaveButton.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		//保存信息
		case R.id.second_save_Button:
			String name=mNameEditText.getText().toString();
			int age=Integer.parseInt(mAgeEditText.getText().toString());
			//得到Editer對象
			SharedPreferences.Editor editor=getSharedPreferences("SPxu", MODE_PRIVATE).edit();
			editor.putString("name", name);
			editor.putInt("age", age);
			editor.commit();

			break;
			//讀取信息
		case R.id.second_read_Button:
			SharedPreferences preferences=getSharedPreferences("SPxu", MODE_PRIVATE);
			String mName=preferences.getString("name", "");
			int mAge=preferences.getInt("age",0 );
			Toast.makeText(SecondActivity.this, "name is:"+mName+",age is:"+mAge, Toast.LENGTH_LONG).show();

			break;
		}

	}
}

運行程序,輸入信息,點擊保存,讀取後即可看到讀取到的效果。


3、對SharedPreferences的封裝

我們可以採用單例模式對SharedPreferences進行封裝,保證在當前應用程序只有一個SharedPreferences對象,並且封裝了save方法、get方法以及clear方法,更加方便使用

新建一個類SPUtil

public class SPUtil {
	
	private static SharedPreferences mPreferences;
	private static SPUtil mSpUtil;
	private SPUtil(){};
	
	public static SPUtil getInstance(Context context){
		if(mSpUtil==null){
			mSpUtil=new SPUtil();
		}
		return initSP(context);
	}
	//初始化SharedPreferences對象
	private static SPUtil initSP(Context context){
		if(mPreferences==null){
			mPreferences=context.getSharedPreferences("SPxu", Context.MODE_PRIVATE);
		}
		return mSpUtil;
	}
	
	public void save(String key,String value){
		mPreferences.edit().putString(key, value).commit();
	}
	
	public String get(String key){
		return mPreferences.getString(key, "");
	}
	
	public void clear(){
		mPreferences.edit().clear().commit();
	}

}


可以將上一個例子做下修改,使用這個SPUtil類

保存信息

			String name=mNameEditText.getText().toString();
			String age=mAgeEditText.getText().toString();
			SPUtil.getInstance(this).save("name", name);
			SPUtil.getInstance(this).save("age", age);

讀取信息

	
			String mName=SPUtil.getInstance(this).get("name");
			String mAge=SPUtil.getInstance(this).get("age");


可以看到很方便,並且保證了當前應用程序只有一個SharedPreferences對象,這個很關鍵


4、使用實例,實現記住密碼功能

在前面的broadcast學習中,做了一個登陸界面,登陸過後點擊按鈕模擬強制下線,在那個例子中加入一個記住密碼checkBox,並且使用了剛剛封裝的SPutil類。



public class SecondActivity extends BaseActivity implements OnClickListener{
	
	private Button mLoginButton;
	private EditText mUserNameEditText;
	private EditText mPasswordEditText;
	private CheckBox mRememberCheckBox;
	
	
	private static final String TAG="Secondctivity";

	@Override
	public void findId() {
		mLoginButton=(Button) findViewById(R.id.login_loginButton);
		mUserNameEditText=(EditText) findViewById(R.id.login_userName_EditText);
		mPasswordEditText=(EditText) findViewById(R.id.login_password_EditText);
		mRememberCheckBox=(CheckBox) findViewById(R.id.login_rememberCheckBox);
	}

	@Override
	public void setListener() {
		mLoginButton.setOnClickListener(this);
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.login);
		//從SharedPreferences中獲取數據是否記住密碼
		String mIsRemember=SPUtil.getInstance(this).get("isRemember");
		if(mIsRemember.equals("true")){
			//如果是記住密碼,再獲取到用戶名和密碼,並顯示
			mUserNameEditText.setText(SPUtil.getInstance(this).get("userName"));
			mPasswordEditText.setText(SPUtil.getInstance(this).get("password"));
			mRememberCheckBox.setChecked(true);
		}
	
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.login_loginButton:
			String userName=mUserNameEditText.getText().toString();
			String password=mPasswordEditText.getText().toString();
			
			if(userName.equals("user") && password.equals("123456")){
				if(mRememberCheckBox.isChecked()){
					//如果記住密碼被選中了,將用戶名和密碼存儲到SharedPreferences中,並設置記住密碼
					SPUtil.getInstance(this).save("userName", userName);
					SPUtil.getInstance(this).save("password", password);
					SPUtil.getInstance(this).save("isRemember", "true");
					
				}else{
					//如果記住密碼沒被選中,就將SharedPreferences對象中的數據全部清空掉
					SPUtil.getInstance(this).clear();
				}
				startActivity(new Intent(SecondActivity.this,ThreeActivity.class));
				finish();
				
			}else{
				Toast.makeText(SecondActivity.this, "用戶名或密碼錯誤", Toast.LENGTH_LONG).show();
			}
			break;
		}
	}
	
	
}

運行程序,輸入賬號密碼,選中記住密碼,然後登陸,點擊強制下線,然後重新出現的登陸界面就會自動存在用戶名和密碼了。當然這只是學習的例子,帳號和密碼這樣保存是極不安全的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章