原理:查了挺多资料,发现没有真正意义上的将sqlite和apk一起打包,这里通过将默认路径下的sqlite数据库复制到assets目录下,apk在首次打开的时候会判断sqlite的默认路径是否存在这个数据库,如果不存在,就将assets目录下的已经保存的数据库,通过IO流的形式复制到database路径下。
1,将data/data/项目包名/database/下你的数据库复制到assets目录下;
在这里插入图片描述
在这里插入图片描述
2,在app启动的时候判断在data/data/database/目录下存在你要的数据库,如果存在不进行复制,如果不存在,则进行io复制数据库文件,有个小坑,如果你后续是用默认在data/data/database目录下读取数据库的,一定要保证你用IO流写入的数据库在这个路径之下。(小心目录的路径前后都有斜杠)

 String DB_PATH = "/data/data/com.siyusoulmate.mm/databases/";
    String DB_NAME = "mm.db";
 private void cloneData() {
//        Log.e("TAG", "cloneData: ",new File(DB_PATH + DB_NAME)).exists() == false);
        if ((new File(DB_PATH + DB_NAME)).exists() == false) {
            Log.e("数据库是否存在", "cloneData: "+"不存在" );
            // 如 SQLite 数据库文件不存在,再检查一下 database 目录是否存在
            File f = new File(DB_PATH);
            // 如 database 目录不存在,新建该目录
            Log.e("目录路径", "cloneData: "+f );
            if (!f.exists()) {
                f.mkdir();
            }


            try {
                // 得到 assets 目录下我们实现准备好的 SQLite 数据库作为输入流
                InputStream is = getBaseContext().getAssets().open(DB_NAME);
                // 输出流
                OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);


                // 文件写入
                byte[] buffer = new byte[1024];
                int length;
                while ((length = is.read(buffer)) > 0) {
                    os.write(buffer, 0, length);
                }


                // 关闭文件流
                os.flush();
                os.close();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else {
            Log.e("数据库是否存在", "cloneData: 存在数据库");
            Log.e("存在目录", "cloneData: "+(new File(DB_PATH + DB_NAME)).getAbsolutePath());

//            /data/data/com.siyusoulmate.mm/databases/mm.db
        }

    }

3,之后便是正常的读取数据库了,跟你在database下读取的操作一样。

 helper=new MyDatabaseHelper(this,"mm.db",null,1);
 database=helper.getWritableDatabase();
 Cursor cursor=database.query("T_MMCollection",new String[]{"TimeStamp","ParamValue","MeasureTime","DevType"},"UserID=? and ParamName=?",new String[]{String.valueOf(userId),"空腹"},null,null,"MeasureTime desc","1");
        if(cursor.moveToFirst()){
            do{
                FBGValue=cursor.getInt(cursor.getColumnIndex("ParamValue"));
//                Log.e(" bloodPressureFragment", "onClicked: systolicValue"+resultValue );
               String meassureTime_FBG=cursor.getString(cursor.getColumnIndex("MeasureTime"));
               measureDate_FBG=MyTimeUtils.timeMeassureToDate(meassureTime_FBG);
                if(measureDate_FBG==null){
                    measureDate_FBG=MyTimeUtils.timeMeassureToDate_min(meassureTime_FBG);
                }
                devType_FBG=cursor.getInt(cursor.getColumnIndex("DevType"))==0?"(手动输入)":"自动输入";
            }while (cursor.moveToNext());
        }
        cursor.close;
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐