android缓存数据库⽅案,Android本地数据存储⽅案(⼀)Android系列的博客主要是记录和总结⾃⼰在平时学习之中遇到的问题,⽅便⽇后⽤到时查看,同时也希望对读者有所帮助。不⾜之处,欢迎指正~
在说到Android数据存储之前,先提⼀下数据持久化,所谓数据持久化就是将内存中的瞬时数据保存下来,在应⽤开发中是很重要的部分。举个栗⼦,我们打开⼀个应⽤之后输⼊了⽤户名和密码,之后回到了桌⾯,再回到应⽤时,我们希望之前输⼊的内容还在,这个要怎么实现呢?可以在回到桌⾯时将数据保存,返回视图时再填⼊数据。
其实不⽌是这些瞬时数据的保存,包括⼀些和应⽤相关的数据也是需要保存的,⽐如⽤户第⼀次登陆之后,之后再进⼊应⽤不必再次登陆,那么⽤户的信息就需要保存下来。下⾯进⼊正题。
注意:数据持久化应该结合Activity的⽣命周期使⽤。
Android本地数据存储有以下⼏种⽅式:
SharedPreferences:⽤户偏好设置
内部存储,数据存储到⼿机内置存储器
外部存储,外部SD卡中存储数据
SqlLite本地数据库存储
ContentProvider
其中内部存储和外部存储都属于⽂件存储,这次主要是介绍SharedPreferences和内部存储。
你在天堂里遇见的五个人
1. SharedPreferences:⽤户偏好设置
SharedPreferences使⽤键值对来存储数据,默认以xml⽂件形式进⾏存储,对应的⽂件保存到⼿机内存的data//xxx(保存数据时建⽴的⽂件)⽬录下⾯,提供和putString(),putInt(),putBoolean()等⽅法存储不同类型的数据,使⽤时很⽅便。
因为SharedPreferences存储时的数据格式和数据类型限制,它只适⽤于存储⼀些简单⽤户设置,例如⽤户设置的夜间模式,⾳量,或者登录信息等。
如何获取SharedPreferences
Android提供了3中⽅法获取SharedPreferences对象。
1) Context 类中的 getSharedPreferences()⽅法
参数:getSharedPreferences()需要如下两个参数
String类型:指定⽂件名(不需要带⽂件后缀)
自制冰皮月饼int类型:指定⽂件的操作模式,常⽤的是MODE_PRIVATE (该⽂件只允许本应⽤程序进⾏读写),MODE_APPEND(对⽂件进⾏写⼊操作时,是在⽂件尾追加内容),MODE_MULTI_PROCESS (⽤于会有多个进程中对同⼀个 SharedPreferences ⽂件进⾏读写的情况)。
2) Activity 类中的 getPreferences()⽅法
参数:只接收⼀个操作模式参数。
这个⽅法时会⾃动将当前活动的类名作为 SharedPreferences 的⽂件名。
3) PreferenceManager 类中的 getDefaultSharedPreferences()⽅法
白雪公主的故事完整版这是⼀个静态⽅法,它接收⼀个 Context 参数,并⾃动使⽤当前应⽤程序的包名作为前缀来命名 SharedPreferences ⽂件
以下是代码案例(以保存登录信息为例):
获取SharedPreferences对象
preferences = getSharedPreferences("login",MODE_PRIVATE);
存储⽤户登录的信息
//获取editor对象
SharedPreferences.Editor editor = preferences.edit();
//存储数据时选⽤对应类型的⽅法
editor.putString("urId",ur.getUrId());
editor.putString("urname",ur.getUrName());
editor.putString("password",ur.getPassword());
editor.putString("role",ur.getUrRole());
//提交保存数据
取出数据
取出数据之前要先获得SharedPreferences对象。
//取出数据,第⼀个参数是存取的键,第⼆个参数-->如果该key不存在,返回默认值,这⾥返回的默认值是""
String urId = String("urname","");
String password = String("password","");
String role = String("role","");
2. ⽂件存储
⽂件存储的形式不对⽂件进⾏任何格式化处理,存⼊是什么样,取出来也是什么样,我们可以⽤它存储⼀些简单类型的数据或⼆进制数据,也可以⾃⼰定义存储规范,⽤来存储复杂的⽂本数据。其实我们可以直接存储json格式的数据在⽂件中,借助Gson类进⾏对象和json格式之间的转换,使⽤很⽅便。
上次我就在应⽤中⽤⽂件缓存了数据,⽐起SQLLite,有时⽂件存储要⽅便⼀些,因为它不⽤进⾏创建数据库,建表等操作。
内部存储:Context提供了很⽅便的打开⽂件的⽅法。可以使⽤Context类提供的openFileOutput (),和openFileInput ()进⾏⽂件写⼊和读取,进⾏缓存的设置和读取,需要注意的是,这⾥传⼊的⽂件名是带有⽂件后缀的。
注意:在读写是⽂件时可以加⼊读写缓冲,加快读写效率。
以下是⽂件存储的内部存储的例⼦(以存储字符串为例):
为了以后使⽤⽅便,可以先定义⼀个⽂件缓存的⼯具类。
public class FileCacheUtil {
//定义缓存⽂件的名字,⽅便外部调⽤
public static final String docCache = "";//缓存⽂件
//缓存超时时间
观赏蟹种类public static final int CACHE_SHORT_TIMEOUT=1000 * 60 * 5; // 5 分钟
/**设置缓存
content是要存储的内容,可以是任意格式的,不⼀定是字符串。
*/
public static void tCache(String content,Context context, String cacheFileName,int mode) {
FileOutputStream fos = null;
try {
含泪活着
//打开⽂件输出流,接收参数是⽂件名和模式
fos = context.openFileOutput(cacheFileName,mode);
fos.Bytes());
} catch (FileNotFoundException e) {
e.printStackTrace();正股级是什么级别
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null) {
大学生自杀try {
fos.clo();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//读取缓存,返回字符串(JSON)
public static String getCache(Context context, String cacheFileName) { FileInputStream fis = null;
StringBuffer sBuf = new StringBuffer();
try {
fis = context.openFileInput(cacheFileName);
int len = 0;
byte[] buf = new byte[1024];
while ((len = ad(buf)) != -1) {
sBuf.append(new String(buf,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.clo();
} catch (IOException e) {
e.printStackTrace();
天下没有不散的宴席
}
}
}
if(sBuf != null) {
String();
}
return null;
}
public static String getCachePath(Context context) {
FilesDir().getAbsolutePath();
}
}
使⽤
使⽤⽂件缓存⼯具类时,直接调⽤它对外提供的函数就可以,将需要数据以字符串形式存,我们可以⾃定义数据存储格式,⽐如说以JSON 串存储。以上代码中,缓存⽂件名写到⽂件缓存的类中,使⽤的时候可以直接调⽤。
提⽰:可以在Activity的onResume()的⽅法中使⽤获取缓存的操作(结合Activity来看),在onPau()是使⽤设置缓存的操作(暂停,跳转到其他Activity时调⽤这个⽅法)。
在应⽤中我们可以根据是否有⽹络或着缓存是否过期来判断是否从⽂件中获取缓存数据。以下是判断缓存是否过期的⽅法。
//判断缓存是否过期,⽐较⽂件最后修改时间
private boolean cacheIsOutDate(String cacheFileName) {
File file = new CachePath(mContext) + "/"
+ cacheFileName);
//获取缓存⽂件最后修改的时间,判断是是否从缓存读取
long date = file.lastModified();
long time_out = (System.currentTimeMillis() - date);
if (time_out > FileCacheUtil.CACHE_SHORT_TIMEOUT) {
return true;
}
return fal;//未过期