SQLite复制db文件与自定义数据库路径

前言

在开发的过程中,我们有时会遇到这种情况:
你在建立本地数据库的时候需要用到一个db文件中的数据,那么怎么处理呢?
你需要:

  • 将db文件复制到自己的项目中
  • 将db文件中的数据拷贝到自己的sqlite中(会涉及到自定义数据库路径的讲解)

下面就来具体的讲解:

一.将db文件复制到自己的项目中

db文件一般拷贝到自己项目的 assets 文件夹下,如果没有assets文件夹,那么新建的话可以参考我的这篇文章
Android studio 添加assets文件夹

好了,现在在你项目中已经有db文件了,接下来就是拷贝数据建自己的数据库了

二. 将db文件中的数据拷贝到自己的sqlite中

写一个DBManager类,代码如下:

/**
 * Instruction:复制assets文件夹下db文件
 *
 * Author:pei
 * Date: 2017/6/27
 * Description:
 */
public class DBManager {

    private static final String ASSETS_DB_NAME = "order_form.db";//assets文件夹下数据库文件名
    //复制数据库相关
    private final String CREAGTE_DB_NAME = "user.db";//复制到手机中的数据库文件名
    private final String DB_PATH="/data/data/%s/databases/";//数据库文件夹路径
  
    private DBManager() {}

    private static class DbHolder {
        private static DBManager instance = new DBManager();
    }

    public static DBManager getInstance() {
        return DbHolder.instance;
    }

    /**获取sqlite数据库对象**/
    public SQLiteDatabase getDataBase() {
        String packageName=AppUtil.getPackageName();
        String dbDirPath=String.format(DB_PATH, packageName);
        String dbFilePath=String.format(DB_PATH+CREAGTE_DB_NAME, packageName);

        if(FileUtil.isSdcardExist()) {
            FileUtil.createDirFile(dbDirPath);//db文件夹不存在则创建
            if(!FileUtil.isFileExist(dbFilePath)){//db文件不存在则从assets复制
                try {
                    FileOutputStream out = new FileOutputStream(dbFilePath);
                    InputStream in = AppContext.getInstance().getAssets().open(ASSETS_DB_NAME);
                    byte[] buffer = new byte[1024];
                    int readBytes = 0;
                    while ((readBytes = in.read(buffer)) != -1){
                        out.write(buffer, 0, readBytes);
                    }
                    out.flush();
                    out.close();
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);
    }

    /**
     * 关闭sqlite数据数据库
     */
    public void closeDataBase(){
        SQLiteDatabase dataBase= getDataBase();
        if(dataBase!=null){
            dataBase.close();
        }
    }
}

下面来看看getDataBase()中的这行代码:

return SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);

当 dbFilePath为 CREAGTE_DB_NAME(CREAGTE_DB_NAME = “user.db”)时,即:

SQLiteDatabase.openOrCreateDatabase("user.db", null);

表示数据创建为默认地址
当 dbFilePath为自定义路径,如 dbFilePath=”/data/data/op/file/user.db”,即:

String dbFilePath="/data/data/op/file/user.db"
SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);

表示数据库创建为自定义地址,这里需要注意的是dbFilePath需要以”/”开头,若

String dbFilePath="data/data/op/file/user.db"
SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);

运行时是会报错的

最后,当然是要添加读写权限了

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

android7.0读写权限也是要添加的,这里就不做讲解了

OK,今天的讲解就到这里了,谢谢大家。

    原文作者:奔跑的佩恩
    原文地址: https://www.jianshu.com/p/6c42de98772b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞