第6章 数据存储全方案,详解持久化技术

第6章 数据存储全方案,详解持久化技术

所有的App都可以说是与数据打交道的,离开数据它们什么都不是.那么平时我们怎么存储一些关键的数据呢?

1 持久化技术简介

数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换

Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、SharedPreference存储以及数据库存储。当然,除了这三种方式之外,你还可以将数据保存在手机的SD卡中,不过使用文件、SharedPreference或数据库来保存数据会相对更简单一些,而且比起将数据保存在SD卡中会更加的安全。

2 文件存储

????文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据.

2.1 将数据存储到文件中

Context类中提供了一个openFileOutput ()方法,可以用于将数据存储到指定的文件中。

openFileOutput ()方法返回的是一个FileOutputStream对象,得到了这个对象之后就可以使用Java流的方式将数据写入到文件中了.

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(openFileOutput("data", Context.MODE_PRIVATE)));

writer.write(data);

?

那么我们来创建一个实际的例子,使用openFileOutput()来进行数据存储.

S1:在activity_main.xml中创建一个EditText控件

S2:在MainActivity.java中运用openFileOutput()方法保存数据

S3:运行项目并查看

?

2.2 从文件中读取数据

????将数据存储到文件中,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据.

????例子程序:

????

3 SharedPreferences存储

不同于文件储存方式,SharedPreferences采用键值对的方式进行存储.也就是说,但保存或获取一个数据,必须同时提供这个数据的Key值.

并且,SharedPreferences可以保存不同类类型的数据,如果保存的是整数,那么取出的就是整数;如果保存的是String字符串,那么取出的也是字符串.

具体的用法下面会详述.

3.1 将数据存储到SharedPreferences中

要使用SharedPreferences保存数据就必须在程序中获得SharedPreferences.这个对象有三种方式获取:

1)Context类中的的getSharedPreferences()方法:这个参数会传入两个参数,SharedPreferences的文件名和操作模式.如果传入的文件名不存在,则会在/data/data/<packagename>/shared_prefs/目录下;操作模式有两种,MODE_PRIVATE和MODE_MULTI_PROCESS.MODE_PRIVATE指的是只有当前程序才能对该文件进行读取,MODE_MULTI_PROCESS一般用于多个进程对这个文件进行访问.(MULTI 许多)

2)Activity类中的getPreferences()方法:与上面这个方法比,这个方法只接受一个参数,就是操作模式的参数.文件名默认为当前活动的类名.

3)PreferenceManager类中的getDefaultSharedPreferences()方法:这是一个静态方法,它接受一个Context参数.并默认使用当前活动的包名作为前缀来命名SharedPreferences文件

?

得到SharedPreferences对象后,就可以向SharedPreferences文件进行数据存储了.存储的步骤分为三步:

S1:调用SharedPreferences对象的edit()方法来获取一个SharedPrefences.Editor对象

S2:用SharedPrefences.Editor对象的putXxx()方法,向Editor对象中添加数据

S3:调用commit()方法,提交并存储数据

?

例子程序:

activity_main.xml

MainActivity.java

?

我们看看实际效果:

实际上他是以XML文件进行存储的

3.2 从SharedPreferences中读取数据

直接上代码说明使用方法:

S1:在activity_main.xml文件中新建一个Button

S2:在MainActivity.java中书写这个Button的点击事件

3.3 实现记住密码功能

S1:实现一个lauout:Login.xml

????

S2:创建LoginActivity.java

S3:在AndroidMainfest.xml中注册Login.xml和activity_main.xml文件

S4:运行程序

4 SQLite数据库存储

Android OS中行有个DB---SQLite数据库.Android中的SQLite数据库到底是如何使用的呢?

4.1 创建数据库

Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级;

1) SQLiteOpenHelper是一个抽象类.如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。

2) SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑.

3) SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象

4) SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收四个参数,第一个参数是Context,这个没什么好说的,必须要有它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时,重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

?

实例:

S1:创建继承SQLiteOpenHelper的实现类MyDatabaseHelper,并重写onCreate()方法

S2:在MainActivity.java中调用getWritableDatabase()方法

验证下数据库是否生成:

4.2 升级数据库

考虑一个情况,现在我们的数据库中已经有一张记录各个书的详细信息表Book,现在我们需要添加一张用户记录书籍分类的表Category,那么该怎么做呢?

创建Category表的语句为:

create table Category (

id integer primary key autoincrement,

category_name text,

category_code integer)

这个需求是不是直接在MyDatabaseHelper.java中加入上述Create语句,并在onCreate()方法中调用呢?

当然不是!

???? 其实没有创建成功的原因不难思考,因为此时BookStore.db数据库已经存在了,之后不管我们怎样点击Create database按钮,MyDatabaseHelper中的onCreate()方法都不会再次执行,因此新添加的表也就无法得到创建了。

???? 解决方案就是在上面的基础上修改onUpgrade()方法:

????注意,这个时候在MainActivity.java中,调用MyDatabaseHelper的构造方法时输入的第四个参数要有所不同:

????

?

4.3 添加数据

见面介绍的是创建和升级数据库

4.4 更新数据

?

4.5 删除数据

?

4.6 查询数据

?

4.7 使用SQL操作数据库

?

5 SQLite数据库的最佳实践

?

5.1 使用事务

?

5.2 升级数据库的最佳写法

?

6 小结与点评

?

?

时间: 2024-10-09 23:27:57

第6章 数据存储全方案,详解持久化技术的相关文章

阅读郭林《第一行代码》的笔记——第6章 数据存储全方案,详解持久化技术

瞬时数据是指那些存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据.这对于一些关键性的数据信息来说是绝对不能容忍的,谁都不希望自己刚发出去的一条微博,刷新一下就没了吧.那么怎样才能保证让一些关键性的数据不会丢失呢?这就需要用到数据持久化技术了. 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机

第一行代码读书笔记——数据存储全方案,持久化技术

三种方式简单实现数据持久化功能 文件存储 简介 将数据存储到文件中 从文件中读取数据 扩展StringStringBuilderStringBuffer SharePreferences存储 注意点 获取SharePreferences对象的三种方式 Context类中的 getSharedPreferences方法 Activity类中的 getPreferences方法 PreferenceManager类中的 getDefaultSharedPreferences方法 向SharedPre

Android开发数据存储之ContentProvider详解

转载:十二.ContentProvider和Uri详解 一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_W

安卓数据存储总结及详解

前言(首先说说什么存储的几个概念) 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据? 在Android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事? 内存: 我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储我们称为Exte

IOS 数据存储之 FMDB 详解

FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过多的关心数据库操作的知识.但是它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本和维护的成本,就需要使用比较原始的SQLite. Core Data是ORM的一种体现,使用Core Data需要用到模型数据的转化,虽

IOS 数据存储之 SQLite详解

在IOS开发中经常会需要存储数据,对于比较少量的数据可以采取文件的形式存储,比如使用plist文件.归档等,但是对于大量的数据,就需要使用数据库,在IOS开发中数据库存储可以直接通过SQL访问数据库,也可以通过ORM进行对象关系的映射,当然也可以选择使用第三方框架实现对数据库的操作.在这里,主要来讲解一下第一种方式,SQLite. SQLite 数据库有很多,分为重量级和轻量级两类,移动设备的内存比较小,因此需要选择轻量级的数据库.在移动设备上应用程序开发中使用数据库,比较主流的是SQLite.

第五章 数据存储

第五章 数据存储 我们用解析器解析出数据之后,接下来的一步就是对数据进行存储了,保存的形式可以多种多样,最简单的形式可以直接保存为文本文件,如 TXT.Json.CSV 等等,另外还可以保存到数据库中,如关系型数据库 MySQL,非关系型数据库 MongoDB.Redis 等等.那么本章我们就来统一了解一下数据的保存方式. 5.1 文件存储 文件存储形式可以是多种多样的,比如可以保存成 TXT 纯文本形式,也可以保存为 Json 格式.CSV 格式等,本节我们来了解下文本文件的存储方式. 5.1

“全栈2019”Java第五十七章:多态与构造方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第五十七章:多态与构造方法详解 下一章 "全栈2019"Java第五十八章:多态中方法返回类型可以是子类类型 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java

“全栈2019”Java第六十三章:接口与抽象方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第六十三章:接口与抽象方法详解 下一章 "全栈2019"Java第六十四章:接口与静态方法详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&qu