Android (安卓數據的五種存儲方式)

一、文件存儲

文件存儲是一種較常用的方法,文件存儲是Android中最基本的一種數據存儲方式,與Java中的文件存儲類似,都是通過I/O流的形式存儲數據

Android中的文件存儲分爲內部存儲和外部存儲

  • 內部存儲:將應用程序中的數據以文件方式存儲到設備的內部,當內部存儲創建的應用程序被卸載時,其內部存儲文件也隨之被刪除
  • 外部存儲:是將文件存儲到一些外部設備上,例如SD卡或者設備內嵌外部存儲的存儲卡,屬於永久性的存儲方式

內部存儲示例: 

package com.liu.fileio;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button but1 = findViewById(R.id.but_1);
        Button but2 = findViewById(R.id.but_2);

        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                EditText saveCun = findViewById(R.id.et_save);

                String fileName = "data.txt";
                String content = saveCun.getText().toString();

                FileOutputStream fos;

                try {
                    fos = openFileOutput(fileName, MODE_APPEND);
                    fos.write(content.getBytes());
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        but2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                EditText readDu = findViewById(R.id.et_read);

                String content = "";
                FileInputStream fis;

                try {
                    fis = openFileInput("data.txt");
                    //available()方法可以在讀寫操作前先得知數據流裏有多少個字節可以讀取
                    byte[] buffer = new byte[fis.available()];
                    fis.read(buffer);
                    content = new String(buffer);
                    fis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                String strread =  content;
                readDu.setText(strread);
            }
        });
    }
}

界面: 

 openFileOutput 是Context的方法,如果你不是Activity就不能直接調用,而且MODE_PRIVATE要改爲Context.MODE_PRIVATE。

二、SharedPreferences

是Android提供的用來存儲一些簡單的配置信息的一種機制。

  • SharedPreferences是Android平臺上一個輕量級的存儲類。
  • 用於存儲應用程序的配置參數,如用戶名、密碼等。
  • 通過key/value(鍵值對)的形式將數據保存在XML文件中。
  • value值只能是float、int、long、boolean、String、StringSet類型數據。

簡單用法: 

    /**
     * 獲取數據
     */
    private void read2() {
        SharedPreferences sp = getSharedPreferences("data2",MODE_PRIVATE);
        String data = sp.getString("name","不存在");//如果得不到值,則返回後面的不存在
       EditText et = findViewById(R.id.et_read2);
        et.setText(data);
    }

    /**
     * 存入數據
     */
    private void save2() {
        SharedPreferences sp = getSharedPreferences("data2",MODE_PRIVATE);
        //獲取編譯器
        SharedPreferences.Editor editor = sp.edit();
        EditText et = findViewById(R.id.et_save2);
        //存入數據
        editor.putString("name",et.getText().toString());
        editor.putInt("age",21);
        //修改提交
        editor.apply();
    }

注意:

  • 獲取數據的key值與存入數據的key值數據類型要一致,否則查找不到指定數據。
  • 保存SharedPreferences的key值時,使用靜態變量保存,以免操作時寫錯,如private final String key=“itcast”。 

3、SQLite:數據庫是Android自帶的一個輕量級數據庫,支持基本SQL語法。

  • 支持ACID的關係型數據庫管理系統。ACID也就是原子性(Atomicity),一致性(Consistency),隔離性(Isolation),持久性(Durability)
  • SQLite保存數據時,支持Null(零)、Integer(整數)、Real(浮點數字),Text(字符串文本)、Blob(二進制對象) 五種數據類型
  • 重點掌握execSQL()和rawQuery()方法。

      execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行爲的SQL語句

      rawQuery()方法用於執行select語句

基本用法:

首先:

package com.liu.fileio;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class SqlTest extends SQLiteOpenHelper {

    private static final String DBName = "MyTestSQL";    //聲明一個數據庫名
    private static final int VERISON = 1;           //聲明一個數據庫版本號

    public SqlTest(Context context) {
        super(context, DBName, null, VERISON);
    }
    /**
     * 對數據庫表進行初始化,只會在第一次創建數據庫表時執行,並且只執行一次
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //創建表
        String sql = "create table demo(name varchar(20), age integer)";
        //執行SQl語句
        db.execSQL(sql);
    }

    /**
     *這個方法是進行數據版本的更新
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

 之後:

package com.liu.fileio;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class SqlDbTest {
    public SqlTest st;       //獲取SQLiterDatabase類的實例
    public SQLiteDatabase db;//用這個類來進行增刪改查

    public SqlDbTest(Context context){
        st = new SqlTest(context);
        db = st.getWritableDatabase();     //獲取SQLiterDatabase類的實例
    }

    public void InsetrDataforSQL(User user){
        String sql = "insert into demo values(?,?)";
        db.execSQL(sql,new Object[]{user.getName(),user.getAge()});
    }

    public User SelectData(){
        User user = new User();
        Cursor cs = db.rawQuery("select * from demo",null);//cursor:光標
        while(cs.moveToNext()){
            user.setName(cs.getString(cs.getColumnIndex("name")));
            user.setAge(cs.getInt(cs.getColumnIndex("age")));
        }
        return user;
    }
    public void CloseDb(){
        db.close();
    }
}

使用:

   private void read3() {
        SqlDbTest sdt = new SqlDbTest(this);
        User user = sdt.SelectData();

        EditText et = findViewById(R.id.et_read3);
        et.setText(user.getName().toString());
        sdt.CloseDb();
    }

    private void save3() {
        EditText et = findViewById(R.id.et_save3);
        User user = new User(et.getText().toString(),22);
        SqlDbTest sdt = new SqlDbTest(this);
        sdt.InsetrDataforSQL(user);
        sdt.CloseDb();
    }

 

4、ContentProvider:是Android四大組件之一,可以將自己的數據共享給其他應用程序。
5、網絡存儲:是通過網絡提供的存儲空間來存儲/獲取數據信息。

 

 

 

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