今天來給大家講一下Android中如何存儲數據。我編寫Android使用的是Java語言,所以今天講的也是Java版的數據存儲。在Android中,數據存儲主要有三種,文件存儲、Sp、SQLite。文件存儲就是我們平時的IO流,是非常傳統的一種方式。而Sp是Android中的,利用XML文件存儲數據的一種方式,要比文件存儲簡單。SQLite就是一個數據庫了,基本操作和數據庫大致一樣。
1、文件存儲
先寫一個簡潔的登陸界面:
佈局文件activity_main.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用戶名"/>
<EditText
android:id="@+id/et_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="密碼"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="save"
android:text="登錄"/>
</LinearLayout>
MainActivity中基本代碼如下,就是簡單的聲明控件和關聯控件:
public class MainActivity extends AppCompatActivity {
//聲明控件
private EditText etName;
private EditText etPwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
//關聯控件
etName = findViewById(R.id.et_name);
etPwd = findViewById(R.id.et_pwd);
}
}
1.1、保存文件
接下來實現一下點擊事件save():
public void save(View view) {
//當用戶名密碼不爲空時
if(!TextUtils.isEmpty(etName.getText()) && !TextUtils.isEmpty(etPwd.getText())){
FileOutputStream fos = null;
try {
//Context中的方法openFileOutput(),獲取一個FileOutputStream對象
fos = openFileOutput("data", Context.MODE_PRIVATE);
String str = etName.getText().toString().trim() + "#" + etPwd.getText().toString().trim();
fos.write(str.getBytes());
Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}else{
Toast.makeText(getApplicationContext(), "用戶名或密碼不能爲空", Toast.LENGTH_SHORT).show();
}
}
代碼看起來有點亂,我在中間空了許多,主要代碼就那些。利用Context中的openFileOutput(String name, int mode)方法,傳入文件名和操作模式。獲取一個FileOutputStream對象,然後在存儲文件。我這裏直接用#來拼接,這樣是有問題的。這裏只是爲了方便。
1.2、讀取文件
我們寫一個方法load,用來讀取文件:
private void load() {
try{
//利用Context中的openFileInput()方法獲取輸入流
FileInputStream data = openFileInput("data");
BufferedReader reader = new BufferedReader(new InputStreamReader(data));
String line = reader.readLine();
String[] split = line.split("#");
etName.setText(split[0]);
etPwd.setText(split[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
這裏使用了Context中的openFileInput()方法,獲取流,然後讀取文件。因爲文件流比較少用,我就講到這裏。
2、SharedPreferences簡稱Sp
Sp是一種用xml文件存儲數據的方式,下面我具體講一下。
2.1、Sp的創建
sp的創建方式有三種,第一種,之直接使用Context中的getSharedPreferences()方法,傳入文件名和操作模式:
private void initView(){
//使用Context中的getSharedPreferences方法獲取Sp對象
SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
}
第二種,使用Activity中的getPreferences()方法,傳入一個操作模式,文件名自動以類名命名:
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
第三種,使用PreferenceManager中的getDefaultPreferences()方法,傳入一個Context參數:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
2.2、用Sp保存數據
使用Editor對象存儲,Editor中對應的數據類型有對應的方法。putString、putInt...
private void initData(){
//獲取sp對象
SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
//獲取Editor對象
SharedPreferences.Editor editor = sp.edit();
//用Editor對象儲存數據,傳入鍵和值
editor.putString("name", "zack");
//最後調用apply()方法
editor.apply();
}
2.3、獲取Sp中的文件
獲取的時候直接用存儲時的文件名創建一個Sp對象,就可以讀取數據:
private void initData(){
//創建一個文件名爲data的sp對象
SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
//直接通過鍵獲取數據,如果通過這個鍵找不到,就返回第二個參數中的值
sp.getString("name", null);
}
3、SQLite數據庫
3.1、SQLite數據庫的創建
SQLite數據庫的創建需要實現抽象類SQLiteOpenHelper,具體先定義一個類MySQLiteOpenHelper繼承SQLiteOpenHelper:
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
/**
* @param context 上下文
* @param name 數據庫名稱
* @param factory 遊標工場
* @param version 版本
*/
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 數據庫創建時調用這個方法
* @param db 數據庫對象
*/
@Override
public void onCreate(SQLiteDatabase db) {
}
/**
* 數據庫升級的時候自動調用
* @param db 數據庫對象
* @param oldVersion 老版本
* @param newVersion 新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
這裏寫了三個方法,其中onCreate()和onUpgrade()方法爲SQLiteOpenHelper中的抽象方法。onCreate()在數據庫創建時調用,只。而onUpgrade()在數據庫升級時調用()(Version改變時)。所以onCreate()用於初始化表結構、onUpgrade()用於更新表結構。調用db.execSQL()方法,傳入一個SQL語句就好了。
3.2、獲取數據庫
在Activity中創建MySQLiteOpenHelper的實例,然後通過這個實例獲取數據庫:
private void initData(){
//這裏遊標工場暫時用不到,設爲null
MySQLiteOpenHelper sqLiteOpenHelper = new MySQLiteOpenHelper(this, "db", null, 1);
//通過MySQLiteOpenHelper對象獲取數據。這兩個方法暫時不區別
//SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();
SQLiteDatabase db = sqLiteOpenHelper.getReadableDatabase();
}
3.3、數據庫操作
因爲篇幅的關係,這裏先不講這麼多了。SQLite中可以調用DataBase對象的execSQL()方法,通過SQL語句完成大多數操作。具體Android中特有的操作後面我再講。大家有興趣的話可以去了解一下郭林大神的LitePal,用來操作SQLite數據庫方便很多。