android-第一行代码-第六章数据储存——持久化技术 含MMKV和Room新知识点(温故而知新)学习记录

数据储存——持久化

温故而知新可以为师矣!

持久化概念是相对于瞬时数据而言,我们希望在app中产生的一些数据可以在移动设备关闭或者因特殊情况导致内存回收♻️等等状况下可以持久保存下来。
简单来说,就是让数据“活下去“!
按照《第一行代码》的思路,主要有但不局限于三种储存方式——文件储存,Shared Preference储存和数据库存储。

文件储存

文件储存是原封不动地将数据进行储存,一般也是储存一些简单的文本数据或者二进制数据罢了。
这一块还是输入输出流的考察,I/O等等操作。在Context上下文中可以获取一个输入或者输出流进行文件数据的写入和读取。
简单编写一个数据保存和读取的案例:
思路——在EditText中填写数据点击button进行存储,再次start该activity的时候,数据直接展示在EditView中。
以下是整体的构建过程,成功!

package com.example.storagepractice;

import androidx.appcompat.app.AppCompatActivity;

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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {
    private EditText editData;
    private Button btnSave;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editData = findViewById(R.id.edit_data);
        String loadData = load();
        if(!TextUtils.isEmpty(loadData)){
            editData.setText(loadData);
        }
        btnSave = findViewById(R.id.btn_save);
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String info = editData.getText().toString();
                save(info);//保存
            }
        });
    }
    //加载
    private String load() {
        StringBuilder stringBuilder = new StringBuilder();// 记得回顾一下StringBuffer和StringBuild的区别
        try (FileInputStream inputStream = openFileInput("saveData")) {
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(inputStream));
            String stringLine = "";
            while((stringLine = reader.readLine()) != null){
                stringBuilder.append(stringLine);
            }
            if(reader != null){
                reader.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  stringBuilder.toString();
    }
    //输出流进行数据存储
    private void save(String info) {
        FileOutputStream fileOutputStream;
        BufferedWriter writer = null;
        try{
            fileOutputStream = openFileOutput("saveData", MODE_PRIVATE);
            writer  = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
            writer.write(info);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(writer != null){
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String info = editData.getText().toString();
        save(info);
    }
}

顺便再附上关于String和String Buffer以及String Builder的区别

(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder

SharedPreferences储存

这个是Google文档中比较推荐的一个储存方式。不过我推荐腾讯开源的MMKV也是采用kv对进行储存的一种储存工具。可以参考我之前写过的博客进行学习。
先回顾SharedPreferences,毕竟这个是重要一点的。

代码编写:

package com.example.storagepractice;

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 androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class SharedPreferencesActivity extends AppCompatActivity {
    private EditText editData;
    private Button btnSave;
    //这个是测试SharedPreferences的小案例
    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sharedpreferences);
        sharedPreferences = getPreferences(MODE_PRIVATE);
        editor = sharedPreferences.edit();
        editData = findViewById(R.id.edit_data);
        String loadData = load();
        if(!TextUtils.isEmpty(loadData)){
            editData.setText(loadData);
        }
        btnSave = findViewById(R.id.btn_save);
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String info = editData.getText().toString();
                save(info);//保存
            }
        });
    }
    //加载
    private String load() {
        return sharedPreferences.getString("info","null");
    }
    //输出流进行数据存储
    private void save(String info) {
       editor.putString("info",info);
       editor.commit();//commit 和 apply的区别就在于前者返回布尔值
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String info = editData.getText().toString();
        save(info);
    }
}

数据库储存SQLite

SQLite是一个轻量级的数据库,相较于Oracle,MySQL轻量很多了~参考google的SQLite官方文档
根据官方文档的描述

Caution: Although these APIs are powerful, they are fairly low-level and require a great deal of time and effort to use:

There is no compile-time verification of raw SQL queries. As your data graph changes, you need to update the affected SQL queries manually. This process can be time consuming and error prone.
You need to use lots of boilerplate code to convert between SQL queries and data objects.
For these reasons, we highly recommended using the Room Persistence Library as an abstraction layer for accessing information in your app’s SQLite databases.

其实他也不推荐我们直接硬刚SQLite,毕竟很多复杂的东西在里面,繁琐。他推荐我们使用Room进行编写代码。Room的简单入门可以参考该博客,同时推荐一些不太认识Jetpack同学参考某b乎的关于Jetpack的介绍

故这一部分的知识点可能不完全按照《第一行代码》的节奏走。主要是参考官方文档和CSDN中的相关材料进行编写代码,练习一下Room。

整理思路:
1.UI界面,上面输入下面展示——采用的是Recycler View的方式【不过,有点忘记了,再回顾一下就好】
2.数据库搭建好,该数据库仅一个表——汽车;包含汽车的品牌,汽车价格;十分简单的数据库。主要是学来用一下;

因为比较多文字和内容,我就单独写个Demo总结来进行Room的学习;Demo下载;以上就是关于持久化技术的相关总结,欢迎交流互相进步~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值