Android -- sqlite数据库随apk发布

背景                                                                                           

把在工程中测试好的数据库信息碎apk一起发布,但是数据库不会自动安装,尤其里面内容很多的时候,不可能再去每个apk里面再写创建数据库,再写插入数据。

那么这样的话只能将写工程时候的数据库sqlite随apk一起发布了。

要点                                                                                            

  • 将随apk发布的数据库放在android工程下/res/raw路径下。
  • 数据库文件存到手机上时,路径在/data/data/包名/databases下,其他路径则会出错。

代码                                                                                            

public class TestSqlDatabase{
    
    private static final String DATABASE_PATH = "/data/data/your.package.name/databases";

    private static final int DATABASE_VERSION = 0;

    private static final String DATABASE_NAME = "test.db";
    
    private static String outFileName = DATABASE_PATH + "/" + DATABASE_NAME;
    
    private Context context;

   private SQLiteDatabase database;
    
    public TestSqlDatabase(Context context) {
        this.context = context;
        
        File file = new File(outFileName);
        if (file.exists()) {
            database = SQLiteDatabase.openOrCreateDatabase(outFileName, null);
            if (database.getVersion() != DATABASE_VERSION) {
                database.close();
                file.delete();    
            }
        }
        try {
            buildDatabase();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

    private void buildDatabase() throws Exception{
        InputStream myInput = context.getResources().openRawResource(R.raw.test);
        File file = new File(outFileName);
        
        File dir = new File(DATABASE_PATH);
        if (!dir.exists()) {
            if (!dir.mkdir()) {
                throw new Exception("创建失败");
            }
        }
        
        if (!file.exists()) {            
            try {
                OutputStream myOutput = new FileOutputStream(outFileName);
                
                byte[] buffer = new byte[1024];
                int length;
                while ((length = myInput.read(buffer))>0){
                    myOutput.write(buffer, 0, length);
                }
                myOutput.close();
                myInput.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        
        }
    }
}

我是天王盖地虎的分割线                                                                 

这也就是一个IO流的控制,与《Android -- 拷贝assets下的资源文件到SD卡中(可以超过1M)》有着异曲同工之妙。

《Android -- 拷贝assets下的资源文件到SD卡中(可以超过1M)》传送门:http://www.cnblogs.com/yydcdut/p/3744873.html

 

 

转载请注明出处:http://www.cnblogs.com/yydcdut

posted @ 2014-06-12 07:25  我爱物联网  阅读(1720)  评论(2编辑  收藏  举报
AmazingCounters.com