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、网络存储:是通过网络提供的存储空间来存储/获取数据信息。

 

 

 

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