初识Android | 青训营笔记

110 阅读3分钟

初识Android | 青训营笔记

这是我参与「第四届青训营」笔记创作活动的的第7天

数据存储

SharedPreference存储(共享参数)

  • 保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。

  • 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。

  • 存储步骤

    1. 使用Activity类的getSharedPreferences方法获得SharedPreferences对象;
    2. 使用SharedPreferences接口的edit获得SharedPreferences.Editor对象;
    3. 通过SharedPreferences.Editor接口的putXXX方法保存key-value对;
    4. 通过SharedPreferences.Editor接口的commit方法保存key-value对。
  • 读取数据

    1. 使用Activity类的getSharedPreferences方法获得SharedPreferences对象;
    2. 通过SharedPreferences对象的getXXX方法获取数据
  • 代码演示

import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText etName,etAge;
    private Button btnSave,btnResume;
    private SharedPreferences sp; 
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        sp = getSharedPreferences("configs", MODE_PRIVATE);
    }

    private void initView() {
        etName = (EditText) findViewById(R.id.et_name);
        etAge = (EditText) findViewById(R.id.et_age);
        btnSave = (Button) findViewById(R.id.btn_save);
        btnResume = (Button) findViewById(R.id.btn_resume);

        btnSave.setOnClickListener(this);
        btnResume.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_save: //保存数据
                String name = etName.getText().toString().trim();
                String age = etAge.getText().toString().trim();
                if (TextUtils.isEmpty(name) || TextUtils.isEmpty(age)){
                    return;
                }
                // 编辑器
                SharedPreferences.Editor editor = sp.edit();

                // 数据存储,只能存储简单的数据类型
                editor.putString("name",age);
                editor.putString("age",name);

                // 提交 --> 对数据的一个保存
                boolean commit = editor.commit();
                if (commit){
                    Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
                    etName.setText("");
                    etAge.setText("");
                }

                break;
            case R.id.btn_resume:   //恢复数据

                String nameValue = sp.getString("name","");
                String ageValue = sp.getString("age","");

                etName.setText(nameValue);
                etAge.setText(ageValue);

                break;
        }
    }
}

文件存储

  • 存储二进制格式文件

  • 存储步骤

    1. 调用openFileInput()并传递要读取的文件的名称。这返回一个FileInputStream
    2. 从文件中读取字节read()
    3. 然后关闭流 close()

ContentProvider

  • 跨进程共享数据
  • 安卓四大组件之一
  • 把私有数据暴露给其他的应用,通常把私有数据库的数据暴露给其他的应用。

数据库存储(SQLite数据库)

  • 复杂对象存储

  • 需要对数据进行增删改查

  • 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。

  • 存储步骤

    • 创建数据库需要使用到一个抽象类SQLiteOpenHelper;(onCreate():创建数据库; onUpgrade():升级数据库)
    • 创建数据库表:
          //创建数据库的表
       @Override
       public void onCreate(SQLiteDatabase sqLiteDatabase) {
               sqLiteDatabase.execSQL("create table user(" +
                   "id integer " +
                   "primary key autoincrement,username " +
                   "varchar(20),password varchar(20)," +
                   "age integer)");
       }
    
    • MainActivity中实例化对象:
      public class MainActivity extends AppCompatActivity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              //创建好数据库,并与数据库之间建立连接
              DBOpenHelper dbOpenHelper=new DBOpenHelper(MainActivity.this,"test",null,1);
              //打开数据库,返回一个可对数据读写操作的对象
              SQLiteDatabase sqLiteDatabase=dbOpenHelper.getWritableDatabase();
      
              findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      //方法一:直接执行数据库执行语句
                      //sqLiteDatabase.execSQL("");
                      //方法二:
                      //类似hashmap,以键值对保存数据  key->数据表列名  value->列的值
                      ContentValues contentValues=new ContentValues();
                      contentValues.put("username","test1234");
                      contentValues.put("password","123456");
                      contentValues.put("age",19);
                      sqLiteDatabase.insert("user",null,contentValues);
                  }
              });
          }
      }
      
  • 他人详解:独家食用指南系列|Android端SQLite的浅尝辄止 - 掘金 (juejin.cn)

比较

image.png

数据库框架

image.png

  • Room:官方对SQLliteOpenHelper的再封装。 image.png
  • Room:包含三个主要组件:
    • 数据库表实体(Database),用于表示应用的数据库中的表。
    • 数据访问对象 (DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
    • 数据库类(Entity),用于保存数据库并作为应用持久性数据底层连接的主要访问点。

参考资料