1.什么是数据持久化?
在介绍数据持久化技术之前,我们先引用一个概念,瞬时数据
瞬时数据
是指那些存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据。这对于一些关键性的数据信息来说是不能容忍的。
例如:自己发了一条朋友圈,刷新一下数据就消失了,这是很不友好的。
那么怎样才能保证一些关键性信息不丢失呢?这时就需要引用数据持久化
技术了。
数据持久化
就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在电脑或手机在关闭状态,这些数据仍然不会消失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是持久状态的。持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间转换。
2.Android的持久化技术
Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即:
1.文件存储
2.SharedPreference 存储
3.数据库存储
除了以上三种方式,还可以将数据保存在手机的SD卡中,不过使用以上三种方式相对简单来些,而且比直接保存在SD卡中相对较安全。
3.SharedPreferences存储
3.1.使用键值对的方式来存储数据,SharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs/
目录下的
3.2.获取SharedPreferences对象的三种方法
1)Context类中的getSharedPreferences()方法
2)Activity类中的getPreferences()方法
3)PreferenceManager 类中的getDefaultSharedPreferences()方法
3.3.写数据到SharedPreferences中
为了把数据写到SharedPreferences文件,需要通过执行edit()创建一个 SharedPreferences.Editor,然后通过Editor对象的putXxx()方法存入键值对数据,最后commit()方法提交数据
SharedPreferences sp= getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
3.4.从SharedPreferences读取数据
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
SharedPreferences sp= getSharedPreferences(PREFS_NAME, 0);
boolean silent = sp.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
SharedPreferences sp= getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("silentMode", mSilentMode);
editor.commit();
}
}
4.手机内存
保存在手机内存的数据是应用私有的,其他应哟无权访问,当用户卸载应用的时候,数据也会随之被删除。
通过Activity的openFileOutput()和 openFileInput()方法可以拿到输出流和输入流,然后通过流读写数据。
4.1创建并写入文件到手机内存
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
openFileOutput(),参数1:文件名,参数2:文件访问模式,文件默认存储到/data/data/<packagename>/files/
目录下的
模式及其说明:
MODE_PRIVATE: 私有模式,默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容
MODE_WORLD_READABLE: 只读模式,API 17后过时
MODE_WORLD_WRITEABLE: 只写模式,API 17后过时
MODE_APPEND: 追加模式,如果该文件已存在就往文件里面追加内容,不存在就创建新文件
注意:Android 7.0 之后,使用 FileProvider分享私有数据
4.2从手机内存读取文件
FileInputStream inputStream = null;
try {
inputStream = openFileInput(FILENAME);
...
} catch (Exception e) {
e.printStackTrace();
}finally {
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.3缓存文件
1)getCacheDir:获取缓存路径
2)getFilesDir:获取缓存的绝对路径
File.createTempFile()
public File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
}
5.手机外部存储
5.1读写文件权限,在清单文件中配置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
动态检查权限
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
将文件以public形式保存在外部存储
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
将文件以private形式保存在外部存储中
public File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = new File(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
查询剩余空间
可以通过File类的getFreeSpace()方法获取剩余空间,getTotalSpace()方法获取总大小
删除文件
可以通过File对象的delete方法删除文件,如果文件保存在内部存储,可以通过Context的deleteFile(fileName)方法删除
Environment
1、getExternalStorageState():获取外部存储状态
状态以及说明:
MEDIA_MOUNTED: SD卡已经挂载,可用
MEDIA_UNKNOWN: 不能识别SD卡
MEDIA_MOUNTED_READ_ONLY: 只读状态
MEDIA_UNMOUNTED: SD卡存在但是没有挂载
MEDIA_REMOVED: SD卡已经移除
MEDIA_CHECKING: SD卡正在准备
方法及说明:
getExternalStorageDirectory(): 获取外部存储路径
getExternalStoragePublicDirectory(): 获取public的外部路径
getExternalFilesDir(): 获取私有的外部路径
getDataDirectory(): rom内存
使用SQLite数据库
数据库文件会存放在/data/data/<package name>/databases/目录下
1、SQLiteOpenHelper
创建数据库的辅助类
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "user.db";
private static final int VERSION = 1;
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
//name:数据库名称,version:数据库版本,factory:游标工厂
}
public MySQLiteOpenHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}
//数据库创建
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person (_id integer primary key autoincrement, " +
"name char(10), phone char(20), money integer(20))");
}
//数据库升级
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
}
}
游标Cursor
moveToNext() 移动到下一个数据
moveToFirst() 移动到第一个数据
moveToPrevious() 移动到前一个数据
moveToLast() 移动到下一个数据
getString() 获取String类型的值
getInt() 获取int类型的值
getColumnIndex() 获取列索引
getColumnNames() 获取所有字段名字
getCount() 获取数据的个数
事务Transaction
try {
//开启事务
db.beginTransaction();
...........
//设置事务执行成功
db.setTransactionSuccessful();
} finally{
//关闭事务
//如果此时已经设置事务执行成功,则sql语句生效,否则不生效
db.endTransaction();
}
数据库SQLiteDatabase
常用的一些方法:
execSQL(): 执行SQL语句实现增删操作
Cursor rawQuery(): 执行sql语句查询数据库
insert(): 往数据库插入数据
delete(): 从数据库删除数据
update(): 更新数据库
query(): 查询数据
beginTransaction(): 开始事务
setTransactionSuccessful(): 设置事务成功
endTransaction(): 结束事务
查询数据库
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
table 表名
columns 查询的字段
selection 查询条件,对应sql语句的where条件
selectionArgs 填充查询条件的占位符
groupBy 分组参数
having 分组条件
orderBy 排序,“字段名 desc/ ASC”
limit 分页查询,“m,n”,m表示从第几条开始查,n表示一个查询多少条数据
select * from blacknumber limit pagesize offset startindex
//pageSize每页有多少条数据,startIndex 从哪条数据开始
android的数据持久化方式分为五种:
1 使用SharedPreferences存储数据;
2 文件存储数据;xml,json
3 SQLite数据库存储数据;
4 使用ContentProvider存储数据;
5 网络存储数据;
网友评论