在assets目录下存放本地数据库

对于一些来自本地的庞大数据库,如果还是依靠SQLiteOpenHelper再去创建数据库的话,太耗时耗力了。所以最常见的做法是:将数据库放在assets目录下,跟随apk一起发布出去。存放在该目录下的文件的特点:

1.assets里面存放的都是原生文件,不会对里面的文件转码
2.该目录下的文件只支持读取,即只能获取输入流
3.不在R文件注册
4.可以建文件夹
5.一般存放网页,图片,音乐,数据库,文本文件等:

但是一旦将数据库存储在此目录下,就不能访问该数据库了(因为数据库打不开了)。解决方案是:将数据库拷贝到手机本地目录(手机内存和外存都可以)。
拷贝数据库的最佳时间:项目初始化的时候,一般就是在展示公司Logo,检查版本更新的时候开始拷贝。并且,控制好只拷贝一次。所以在有数据库在assets目录下,需要拷贝的时候,可以新增如下代码,然后在onCreate中调用这个方法完成只拷贝一次:

// 从asserts目录下拷贝文件到files
    private void copyDB() {

        // 获取输出流,文件存储目录:data/data/包名/files目录下,文件名相同
        File file = new File(getFilesDir(), "xxxxx.db");

        // 当文件不存在的时候:才去拷贝,已经存在的不再去拷贝了。
        if (!file.exists()) {
            AssetManager assetManager = getAssets();

            try {

                // 获取输入流
                InputStream is = assetManager.open("xxxxx.db");

                FileOutputStream fos = new FileOutputStream(file);
                // 开始读和写
                byte[] bys = new byte[1024];
                int len;
                while ((len = is.read(bys)) != -1) {
                    fos.write(bys, 0, len);
                }
                is.close();
                fos.close();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值