《greenDao快速使用3——数据保存至SD卡》
一、环境
当程序卸载了,android设备里面的数据库还能够保存吗?
在实际应用过程中,可能会出现这个问题。我需要更新应用,导致数据库里面的资料都没了。这个时候我们需要把数据保存到SD卡中,这样,就避免了数据的流失。
二、代码
package com.xs.laizhen.visit.greendao; import android.content.Context; import android.content.ContextWrapper; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.text.TextUtils; import android.util.Log; import com.xs.laizhen.visit.base.MyApplicaion; import com.xs.laizhen.visit.utils.CommonUtils; import java.io.File; import java.io.IOException; /** * 类名称:GreenDaoContext * 创建者:Create by laizhen * 创建时间:Create on 2018/1/31 * 描述:主要用于基于GreenDao框架自定义数据库路径 */ public class GreenDaoContext extends ContextWrapper { private String currentUserId = "greendao";//一般用来针对一个用户一个数据库,以免数据混乱问题 private Context mContext; public GreenDaoContext() { super(MyApplicaion.getContext()); this.mContext = MyApplicaion.getContext(); // this.currentUserId = "greendao";//初始化 } /** * 获得数据库路径,如果不存在,则创建对象 * * @param dbName */ @Override public File getDatabasePath(String dbName) { String dbDir = CommonUtils.getDBPath(); Log.d("GreenDaoContext", "数据库地址:" + dbDir); if (TextUtils.isEmpty(dbDir)) { Log.e("SD卡管理:", "SD卡不存在,请加载SD卡"); return null; } File baseFile = new File(dbDir); // 目录不存在则自动创建目录 if (!baseFile.exists()) { baseFile.mkdirs(); } StringBuffer buffer = new StringBuffer(); buffer.append(baseFile.getPath()); buffer.append(File.separator); buffer.append(currentUserId); dbDir = buffer.toString();// 数据库所在目录 buffer.append(File.separator); // buffer.append(dbName+"_"+currentUserId); buffer.append(dbName); String dbPath = buffer.toString();// 数据库路径 // 判断目录是否存在,不存在则创建该目录 File dirFile = new File(dbDir); if (!dirFile.exists()) { dirFile.mkdirs(); } // 数据库文件是否创建成功 boolean isFileCreateSuccess = false; // 判断文件是否存在,不存在则创建该文件 File dbFile = new File(dbPath); if (!dbFile.exists()) { try { isFileCreateSuccess = dbFile.createNewFile();// 创建文件 } catch (IOException e) { e.printStackTrace(); } } else isFileCreateSuccess = true; // 返回数据库文件对象 if (isFileCreateSuccess) return dbFile; else return super.getDatabasePath(dbName); } /** * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。 * * @param name * @param mode * @param factory */ @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory); return result; } /** * Android 4.0会调用此方法获取数据库。 * * @param name * @param mode * @param factory * @param errorHandler * @see ContextWrapper#openOrCreateDatabase(String, int, * SQLiteDatabase.CursorFactory, * DatabaseErrorHandler) */ @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory); return result; } }
工具类
package com.xs.laizhen.visit.utils; import android.os.Environment; import android.text.TextUtils; import java.io.File; /** * 类名称:CommonUtils * 创建者:Create by liujc * 创建时间:Create on 2016/12/5 11:36 * 描述:TODO * 最近修改时间:2016/12/5 11:36 * 修改人:Modify by liujc */ public class CommonUtils { public static String getSDPath() { boolean sdCardExist = Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); if (sdCardExist) { return Environment.getExternalStorageDirectory().toString(); } else { return ""; } } /** * 文件的路径名称 * @return */ public static String getDBPath() { String sdCardPath = getSDPath(); if (TextUtils.isEmpty(sdCardPath)) { return ""; } else { return sdCardPath + File.separator + "GreenDao" + File.separator + "sqlite"; } } }
最后,修改一下application文件。
好了,到这里就可以测试一下了。使用之后,打开android设备文件管理器,在根目录下就能找到Greendao的文件了。卸载应用重新安装,数据也是依然存在的。