zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    PHP中Foreach在引用时的陷阱 j神
    Yii中Session和cookie的用法 j神
    如何解决web大流量、高并发的问题 j神
    PHP无限级分类的递归算法 j神
    关于breadcrumbs j神
    MySQL索引分析和优化 j神
    Yii笔记 j神
    YII中的URL Management j神
    forward与redirect的区别 j神
    网络编程学习笔记
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3783176.html
Copyright © 2011-2022 走看看