Android存儲數據的三種方式

今天來給大家講一下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數據庫方便很多。

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