详解Android数据存储技术

前言
学习Android相关知识,数据存储是其中的重点之一,如果不了解数据,那么让你跟一款没有数据的应用玩,你能玩多久呢?答案是这和没有手机几乎是差不多的。我们聊QQ,聊微信,看新闻,刷朋友圈等都是看里面的数据,所以在Android中数据对我们是多么重要。
数据,如今是数据大时代,谁拥有数据,谁就能掌握未来,这一点很可怕的,现在你用的手机APP中存在着你的大量数据信息,大数据的积累可以掌握出你的作息时间,生活规律等。
对数据的存储有着良好的技术支持,是一个好的开发平台的体现,如果不能长时间保持数据,那么必然会被时代发展所淘汰。那么有长期保持数据的概念,就有瞬时数据这一概念的出现,什么是瞬时数据呢?
见名知意,瞬时代表一瞬间,指当存储的数据因程序关闭或其他原因等导致数据丢失,如果你想发个自拍发个朋友圈,可是一刷新就没了,是不是很恼怒呢?气不气,气不气,是不是想砸手机?
本篇主要介绍Android中实现数据存储的三种方式:
- 文件存储
- SharedPreference存储
- SQLite数据库存储
下面给出三种方式的数据文件默认存储的位置:

在DDMS里的File Explore下打开data文件夹,切换到DDMS视图,点击FileExplorer切换卡,进入到/data/data//files/目录下,可以看到文件了。
DDMS文件的导出

好了,接下来分析数据存储方式了。如上图为文件存储位置,接下讲第一个文件存储。然后再接着讲SharedPreferences存储和SQLite数据库存储。
文件存储
文件存储是Android中最基本的一种存储方式,和Java中实现I/O的方式,由Context类提供openFileInput()和openFileOutput()方法打开。文件存储主要分两种存储,一种是内部存储,一种是外部存储。
内存存储:使用了FileInputStream类中的openFileInput()方法,用于读取数据;使用了FileOutputStream类中的openFileOutput()方法,用于写入数据。
外部存储:使用Enviroment类中的getExternalStorageDirectory()方法对外部存储上的文件进行读写。
简化:
FileOutputStream -> openFileOutput()
FileInputStream -> openFileInput()
Environment -> getExternalStorageDirectory()
一,内部存储的写入文件步骤
第一,
获取文件输出流对象 FileOutputStream
第二,
使用FileOutputStream类的openFileOutput(String name, int mode)方法
第三,
调用FileOutputStream对象的write()方法写入文件
第四,
调用flush()方法,因为write()方法是写入缓冲区的,调用flush()方法将缓冲中的数据写入到文件,清空缓存
第五,
close()方法用于关闭FileOutputStream
二,内部存储的读取文件步骤
第一,
获取文件输入流对象 FileInputStream
第二,
使用FileInputStream类的openFileInput()方法来实现
第三,
调用FileInputStream对象的read()方法
第四,
调用close()关闭文件输入流对象
如上分别描述了内部存储的写入文件步骤和读取文件步骤,那么接下来代码例子展示一下这些步骤。
写入数据

在openFileOutput()方法中,接收两个参数,一个是文件名,另一个是文件的操作模式,主要有两种为 MODE_PRIVATE和MODE_APPEND。最后openFileOutput()方法会抛出FileNotFoundException。
主要代码步骤:

读取数据

读取文件内容的使用代码:


综上,在Android中读取与写入文件的方法,和Java中实现I/O的程序是一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。通过Context.openFileOutput()获取输出流,参数分别为文件名和存储模式;通过Context.openFileInput()获取输入流,参数为文件名。
介绍了内部存储,现在介绍外部存储。
外部存储的文件时全局都是可以读的,在程序中,使用Environment类的getExternalStorageDirectory方法,来读取外部文件。

最后外部存储文件,要加入读取与写入的权限,添加
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
这样文件存储就讲得差不多了,多练习试试。对于SharePreferences存储和SQLite存储,现在进入讲解。
下面对SharedPreferences存储介绍:
SharedPreferences是一种数据存储方式,用来存储一些简单的信息,位于android.content包中,以键值对的模式进行存储,键值对(key-value)。对于存储的基本信息,如int,string,boolean,float和long。
- 使用getSharedPreferences()方法获取
- 使用getPreferences()方法获取

实现SharedPreferences存储步骤:
第一,
调用SharedPreferences类的edit()方法,获取SharedPreferences.Editor对象
第二,
调用一个SharedPreferences.Editor对象的putXXX()的方法获取数据
第三,
使用commit()方法提交数据



在这里介绍完文件存储和SharedPreferences,接下来讲SQLite数据库存储。但是除了这三个,还有几种存储方式。如图:

接下来讲讲Android中SQLite数据库的增删改查的操作。

SQLite数据库存储
SQLite是一款轻量级的关系型数据库,它的运算很快,占用空间小,SQLite不仅有SQL语法支持,独立,还有数据库的ACID事务,SQLite数据库为一种嵌入式数据库。
SQLiteOpenHelper类,它是SQLiteDatabase的帮助类,用于管理数据库的创建和升级,SQLiteOpenHelper类为抽象类,有两个要重写的方法:onCreate()和onUpgrade(),用于去实现创建和升级数据库。
在SQLiteOpenHelper类中还需要一个构造方法,这个方法接收四个参数,分别为Context context,String name, CursorFactory factory,int version这四个。第一个是参数context,第二个是数据库名,第三个是自定义Cursor,一般为null,第四个为当前的数据库版本号。
在SQLiteOpenHelper类中有两个重要的实例方法,为getReadableDatabase()和getWritableDatabase()这两个方法。调用这其中的方法就能够创建数据库了。如果存在数据库就打开,没有就创建。
SQLiteOpenHelper类是一个SQLite帮助类,实现SQLite的数据操作,创建一个类去继承SQLiteOpenHelper,接下来代码示例一下。



接下来增加数据
如何增加数据,用put()方法即可,在SQLiteDatabase中提供insert()方法,接下来也讲解一下。

删除数据
用到的方法是delete(),第一个参数为表名,第二三位用于约束。

更新数据
用到的方法是update()方法,参数分别为表名,ContentValues对象,约束,约束,好了,接下来示例一下。

查询数据
用到的方法为query(),这个方法至少需要七个参数(table, columns, selection, selectionArgs, groupBy, having, orderBy),分别为表名,要查询出的名,查询条件语句,对应于selection语句中占位符的值,要分组的列名,分组后过滤条件语句,排序方式。


升级数据库
用到onUpdate()方法,分别删除表,再次在此方法里创建即可。

代码:
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static Integer Version = 1;
//构造函数
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,
int version) {
//必须调用父类当中的构造函数
super(context, name, factory, version);
}
//context:上下文对象
//name:数据库名称
//param:factory
//version:当前数据库的版本
public MySQLiteOpenHelper(Context context,String name,int version){
this(context,name,null,version);
}
public MySQLiteOpenHelper(Context context,String name){
this(context, name, Version);
}
//创建的时候被调用
@Override
public void onCreate(SQLiteDatabase db) {
//创建了数据库并创建一个的表
String sql = "create table sut(id int primary key,name varchar(200))";
db.execSQL(sql);
}
//数据库升级时调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("更新版本为:"+newVersion);
}
}
结语
- Android存储技术知识点就介绍到这了,一起努力吧~
详解Android数据存储技术的更多相关文章
- Android数据存储技术
Android提供了4种数据存储技术,分别是SharedPreferences.Files.SQLite数据库和网络存储数据.(有的开发者认为使用ContentProvider也可以算是一种,但我觉得 ...
- Android数据存储之GreenDao 3.0 详解
前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...
- Android实现数据存储技术
转载:Android实现数据存储技术 本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用Shar ...
- Android数据存储五种方式总结
本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用Cont ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- Android数据存储五种方式
1 使用SharedPreferences存储数据:常用于做本地缓存 2 文件存储数据:(1)data/data/<package name>/files目录内 (2)SDCard内 ...
- (转载)实例详解Android快速开发工具类总结
实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...
- Android - 数据存储 -存储文件
Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...
随机推荐
- Controller层aop
利用@Around通知修改Controller的返回值 自定义一个注解@OperationBtn 在切入点Controller上加上自定义注解 接下来就是重点了,AspectJ写切面类,对该Contr ...
- MySQL InnoDB引擎B+树索引简单整理说明
本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- css选择器querySelectorAll
* querySelectorAll(css的选择器)* 通过css的选择器获取到的一组元素* 获取的也是类数组** 主语* document 从整个页面去获取一组元素* 父级 从父级下去获取一组元素 ...
- Mask RCNN 源码阅读(update)
之前看了Google官网的object_dectect 的源码,感觉Google大神写的还不错.最近想玩下Mask RCNN,就看了下源码,这里刚好当做总结和梳理.链接如下: Google官网的obj ...
- python3之Django基础篇
一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...
- linux下安装haproxy作为端口转发服务器,以及安装keepalived作为haproxy高可用方案
一.安装haproxy作为端口转发服务器(主服务器:172.28.5.4,备服务器:172.28.5.8,浮点IP为:172.28.5.6) 1.安装依赖包 yum -y install wget g ...
- CentOS 特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)
名称 说明 $0 脚本名称 $1-9 脚本执行时的参数1到参数9 $? 脚本的返回值 $# 脚本执行时,输入的参数的个数 $@ 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列 ...
- POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)
做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...
- 【读书笔记】深入应用C++11代码优化与工业级应用 读书笔记01
第一章 使用C++11让程序更简洁.更现代 1.1 类型推导 1.1.1 auto类型推导 1.auto关键字的新意义 不同于python等动态类型语言的运行时进行变量类型的推导,隐式类型定义的类 ...
- java【基础】多态
new 接口就会发生很有意思的现象 public class InerClassDemo { public static void main(String[] args) { // TODO Auto ...