本文介绍Android应用程序数据的存储方式。
目录
一、简介
任何一种开发方式都会涉及到数据的存储,Android开发也不例外,并且相关的数据存储操作十分频繁。
与Android有关的数据存储方式大致分为五种:
- 共享参数SharedPreferences
- 文件存储
- 数据库SQLite
- Content Provider
二、Android数据存储
1.共享参数SharedPreferences
SharedPrefernces通常用于保存少量的,格式简单的数据(字符串,基本类型值等),也可以用于保存应用的配置信息(震动,用户积分、音效等),以及解锁口令的密码之类。
SharedPreferences原理
- 它是一种基于XML文件存储的Key-Value键值。
- 其对象本身是用来获取数据,并不支持存储或修改。
- 如有存储修改需求,可以调用SharedPreferences.editor()方法的Editor对象实现。
SharedPreferences存储模式
由于SharedPreferences本身是一个接口,无法直接创建实例,需要通过Context Mode来获取,SharedPreferences总共有四种存储模式:
- Context.MODE_PRIVATE
- Context.MODE_APPEND
- Context.MODE_WORLD_READABLE
- Context.MODE_WORLD_WRITEBLE
常用的是第一二种,一般使用第一种,在APP内部操作数据。基本不用后两种。
SharedPreferencs用法
- 在使用共享参数之前,要先调用getSharedPreferences函数声明文件名与操作模式:
SharedPreferences shared = getSharedPreferences("share",MODE_PRIVATE);
从getSharedPrefernces中获取的第一个方法是存储的文件名,以share.xml的文件形式存储,第二个参数是操作模式MODE_PRIVATE,表示私有模式。
- 对共享参数的存储数据要要借助Editor类,通常会用到四种方法:putXXX(key,value) ; remove() ; commit() ; clear(); 示例代码:
//获取编辑器对象
SharedPreferences Editor editor = shared.edit();
//添加一个键为name的字符串参数
editor.putString("name","Mr Zhao");
//添加一个键为age的整型参数
editor.putInt("age","23");
//添加一个键为married的布尔型参数
editor.putBoolean("married","false");
//添加一个键为weight的浮点型参数
editor.putFloat("weight","150f")
//提交编辑器中的修改,必须的一行代码
editor.commit();
- 共享参数读取数据较为简单,直接使用对象即可完成数据读取方法的调用(get方法中的第二个参数为默认值),示例代码:
//从共享参数中获取键为name的字符串
String name = shared.getString("name","")
//获取键为age的整型数
int age = shared.getInt("age",0);
//获取键为married的布尔数
boolean married = shared.getBoolean("married",false);
//获取键为weight的浮点数
float weight = shared.getFloat("weight",0);
2.SD卡与文件存储
简介
一般在数据较小,轻量级是考虑用共享参数,而数据较大时考虑用文件存储。
手机空间一般分为内部存储和外部存储(SD卡),以前的SD卡是可拔插式的外部存储卡,后来越来越多的手机把SD卡集成到手机内部,但是还是称为外部存储,但是现在一般很少用到SD卡进行数据存储。
文件目录信息及获取
每一个APP在创建时都会在在内部有一个专门存放数据的私有文件夹,这个文件夹只有APP本身就有读写权限,其他APP是无法进行访问的,这就保证了数据的安全与私密。
在这个私有文件夹中读写数据可以使用Java的构造器FileInputStream和FileOutputStream,也可以使用Android特有的类和方法Context.openFileInput和Context.openFileOutput。
这个私有文件夹存放在/data/com.xxx.xxx/files文件夹下,具体可以通过getDownloadCacheDirectory()来查询具体路径。
有关文件目录信息可以通过Environment类来查询,该类是APP获取各种目录信息的工具,主要方法有以下7种:
- getRootDirectory():获取系统根目录的路径。
- getDataDirectory():获取系统数据目录的路径。
- getDownloadCacheDirctory():获取下载缓存目录的路径。
- getExternalStorageDirctory():获取外部存储(SD卡)的路径。
- getExternalStorageState():获取SD卡的状态。
文件存储实例项目
下面通过一个简单的项目,对文件存储加深理解。
通过自定义一个编辑框,在编辑框中编辑数据,然后通过按钮将数据存储到APP的私有文件夹中。
- 首先布局文件activity_main.xml,具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/file_edit"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="100dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@+id/file_edit"
>
<Button
android:id="@+id/file_add"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="add"
/>
<Button
android:id="@+id/file_read"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="read"
/>
</LinearLayout>
</LinearLayout>
效果如图:
- 然后在MainActivity.java类中,具体代码:
3.数据库SQLite(重要)
SQLite介绍
在大量数据的存储与增删改查的操作中使用文件存储的话效率极低。
SQLite是用C语言编写的开源式嵌入式数据库,占用资源极少,只需要几百几千字节即可运行。
SQLite具有轻量级、独立性、隔离性、跨平台、多语言接口、安全性的特征,广泛应用于各种移动端设备的存储数据库。
Android标准库包含SQLite库以及配套Java辅助类。
SQLite命令
与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。这些命令基于它们的操作性质可分为以下几种:
DDL - 数据定义语言
DML - 数据操作语言
DQL - 数据查询语言
SQLite具体操作
https://www.runoob.com/sqlite/sqlite-intro.html