《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文件。

《greenDao快速使用3——数据保存至SD卡》

      好了,到这里就可以测试一下了。使用之后,打开android设备文件管理器,在根目录下就能找到Greendao的文件了。卸载应用重新安装,数据也是依然存在的。