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();
}
}
保存信息
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");
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;
}
}
}
運行程序,輸入賬號密碼,選中記住密碼,然後登陸,點擊強制下線,然後重新出現的登陸界面就會自動存在用戶名和密碼了。當然這只是學習的例子,帳號和密碼這樣保存是極不安全的。