数据储存——持久化

温故而知新可以为师矣!

持久化概念是相对于瞬时数据而言,我们希望在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;@Overrideprotected 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() {@Overridepublic 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();}}}@Overrideprotected 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;@Overrideprotected 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() {@Overridepublic 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的区别就在于前者返回布尔值}@Overrideprotected 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下载;以上就是关于持久化技术的相关总结,欢迎交流互相进步~

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

  1. 第一行代码 第六章 数据储存方案 - LitePal数据库存储

    LitePal – 一款开源的Android数据库框架. 它采用对象关系映射的模式(ORM),将开发中常用的数据库功能进行封装,使得不用编写SQL语句就可以完成各种建表和增删改查的操作. 在项目中使用 ...

  2. Android第一行代码——第三章:控件的使用方法5A-00-1A-C4-8C-55(2009+jjy)

    标题:这章主要学习如何控件的使用方法 1 TextView. 创建activity_main.xml中的代码 代码如下: <?xml version="1.0" encodi ...

  3. 《Android 第一行代码》十一章 Service学习笔记

    Android中Service学习笔记 Service的基本使用方法 Service的启动方式有两种,第一种是使用startService()和stopService()方法来启动和停止Service ...

  4. 《Android 第一行代码》十一章 “服务的最佳实践”

    服务的最佳实践 项目笔记 上面我们学习的Service服务的基本使用,接下来通过一个具体的下载实例来强化service的使用过程. 1. 新建一个DownloadListener接口 此接口提供了5个 ...

  5. Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)

    Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...

  6. 第一行代码——第十三章:继续进阶——你还应该掌握的高级技巧

    目录: 13.1 全局获取 Context的技巧 13.2 使用 Intent传递对象 13.2.1 Serializable 方式 13.2.2 Parcelable 方式 13.3 定制自己的日志 ...

  7. Android第一行代码-Activity

    文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...

  8. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  9. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  10. Android第一行代码(第一行代码、活动)

    一.第一行代码 1.了解全貌 1.1Android的系统架构 Android的系统架构:Linux内核层.系统运行库层.应用框架层和应用层 1.Linux内核层 Android系统是基于Linux内核 ...

最新文章

  1. OpenCV学习之视频读取与帧的提取、显示及保存
  2. python中if not x: 和 if x is not None: 和 if not x is None的使用和区别
  3. 2020各大网站rss订阅源地址_RSS订阅器inoreader一些使用心得
  4. Linux—目录文件属性和权限管理详解
  5. oracle两个数据库之间,如何实现oracle两个数据库之间的同步
  6. BeginPaint和GetDC有什么区别?【转】
  7. OkHttp之BridgeInterceptor简单分析
  8. 两台服务器ubuntu20.x 直接文件共享,文件挂载 nfs
  9. 计算机图形学 dda,计算机图形DDA算法
  10. 基于STM32的物联网语音控制智能家居
  11. 2021年的学习Flag:只争朝夕,不负韶华
  12. HC(NH 2 ) 2 I (FAI) 甲脒氢碘酸盐 879643-71-7
  13. 如何给php安装上pecl,php如何安装pecl扩展
  14. python实现千牛客服自动回复语_千牛旺旺客服设置自动回复的技巧有哪些?总结性文章来啦...
  15. 华为数通笔记-ISIS基础
  16. linux系统宝塔安装nodejs,node安装,nodejs安装,Windows nodejs安装,Linux nodejs安装
  17. 设备厂商Plc远程上下载程序远程调试运维
  18. AN OPEN-SOURCE SPEAKER GENDER DETECTION FRAMEWORK FOR MONITORING GENDER EQUALITY
  19. 设计模式——备忘录模式
  20. 设置段落缩进html,css怎么设置段落缩进

热门文章

  1. android自动调节屏幕亮度自动调节流程解析
  2. 男人来自火星 女人来自金星(约翰·格雷)
  3. unity ar vr_学习在Unity中创建AR和VR应用
  4. 中国超级计算机之父 孟,晚霞未必逊晨曦——记“中国巨型计算机之父”金怡濂院士...
  5. dojo query 实现Ajax,Dojo Query 详解
  6. 原力计划第5周榜单揭晓!
  7. Do You Even Need Attention? A Stack of Feed-Forward Layers Does Surprisingly Well on ImageNet
  8. Ubuntu14.04显示隐藏文件
  9. 最全的关于硬件测试的解读
  10. 求解答!iframe在IE浏览器加载页面无反应问题