Android 拷贝已有数据库到私有目录下以及数据库升级(data/data/databases/)
2017-09-02 13:56
471 查看
如何拷贝现有的数据库到私有文件下面,以及怎样升级
转载请注明出处:http://blog.csdn.net/zkjthinking/article/details/77800833准备操作(当然是创建好数据库了)
1.1 我用的是navicat 工具
创建你的数据库
数据库名字,表名,自己定义当然可以加很多表。如果是简单的。直接代码搞定了。或者GreenDao,ormlite等,这些都很好用。但是多了。而且数据库中要用大量的数据。这就有点坑了。
注意:android_metadata 需要自己手动去创建 字段只有一个locale 字段值 zh_CN 或者 en_US 这个当然根据你语言环境来处理了。我就用zh_CN, 这个的作用就是告诉系统认识表的内容是那个字符集。表的创建我就不多说了。可视化工具秒秒钟搞定。
1.2 创建自己的表(我copy 了个之前用过的)当然可以建很多,用Excel 可以做好,直接导入都行;
(这是tab_table 表中字段)好了。表准备好了。
copy 创建好的数据库到assets 目录下
3.开始撸代码了
public class MyDBHelper extends SQLiteOpenHelper { private SQLiteDatabase myDataBase; private final Context myContext; public static final int VSESION = 3; /** * @param context */ public MyDBHelper(Context context) { super(context, CopyDBApplication.DBNAME, null, VSESION); this.myContext = context; } /** * 创建一个空的数据库, */ public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { //该数据库已经存在了 } else { //调用这个方法可以创建空数据库,我们自己的数据可可以将其覆盖,并设置版本号(不设置数据升级是个坑) this.getWritableDatabase().setVersion(VSESION); try { //覆盖 String outFileName = CopyDBApplication.DBPATH + CopyDBApplication.DBNAME; InputStream myInput = myContext.getAssets().open(CopyDBApplication.DBNAME); IOHelper.copyBigDataToSD(myInput, outFileName); } catch (IOException e) { throw new Error("io error"); } } } /** * 检测数据库是否存在并且能否打开 */ private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = CopyDBApplication.DBPATH + CopyDBApplication.DBNAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } catch (Exception e) { } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } public SQLiteDatabase openDataBase() throws SQLException { //打开数据库 String myPath = CopyDBApplication.DBPATH + CopyDBApplication.DBNAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); return myDataBase; } @Override public synchronized void close() { if (myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //数据库升级 switch (oldVersion) { case 1: break; case 2: break; } } }
在application中初始化下路径和数据库名称
public class CopyDBApplication extends Application { //该路径也可以自定义到自己的想要的路径下面。但是外部存储卡的存储是不安全的; public static String DBPATH = ""; public static String DBNAME = "BasicDB.db"; /** * 本地存储全路径名目录 */ public static String CACHE_DIR; /** * 本地存储文件夹名 */ public static final String CACHE_DIR_NAME = "您自己定义的路径"; @Override public void onCreate() { super.onCreate(); //当前应用的私有目录下; DBPATH = "/data/data/" + this.getPackageName() + "/databases/"; //该段代码是若想要定义到外部路径下;有些应用是需要定义在外部。使用比较方便 // if (Environment.MEDIA_MOUNTED.equals(Environment // .getExternalStorageState())) { // CACHE_DIR = Environment.getExternalStorageDirectory() // .getAbsolutePath() + "/" + CACHE_DIR_NAME; 9f76 // } else { // CACHE_DIR = Environment.getRootDirectory().getAbsolutePath() + "/" // + CACHE_DIR_NAME; // } } }
拷贝的代码
/** * @param myInput 输入流 * @param targetPath 目标文件路径 * @throws IOException */ public static void copyBigDataToSD(InputStream myInput, String targetPath) throws IOException { OutputStream myOutput = new FileOutputStream(targetPath); byte[] buffer = new byte[1024]; int length = myInput.read(buffer); while (length > 0) { myOutput.write(buffer, 0, length); length = myInput.read(buffer); } myOutput.flush(); myInput.close(); myOutput.close(); }
在用的地方
MyDBHelper myDBHelper = new MyDBHelper(this); try { myDBHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } writableDatabase = myDBHelper.openDataBase();
得到可写的数据库这样就好了。
试试查询好使不看看效果
增删改查都测过了,没问题。
4 . 升级
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //数据库升级 switch (oldVersion) { case 1: //version 改动了写升级的代码 break; case 2: break; }
好了外部数据库copy 私有目录下,的方案就是这样了。拍砖来轻点。打死就看不见美好世界了。当然路径可以自己定义,但是不在私有目录下,安全性不高。
demo 地址 https://github.com/zkjmyy/AndroidDBForData
相关文章推荐
- 拷贝已有数据到/data/data/co.test/databases/目录
- 如何在android应用程序中拷贝第三方资产目录下的数据库文件到应用私有目录下
- Android 数据库升级中数据保持和导入已有数据库(转)
- 升级Android SDK Tools以及Android SDK Platform-tools目录被占用解决方法
- Android 有关SQLite的使用以及数据库版本的升级
- Android 数据库升级中数据保持和导入已有数据库
- Android 数据库升级中数据保持和导入已有数据库
- Android 数据库升级中数据保持和导入已有数据库
- Android获取系统文件目录,让程序访问其他程序的/data/data下的私有文件
- 怎样向android手机/data/data/package_name/目录下拷贝文件
- Android 数据库升级中数据保持和导入已有数据库
- 用adb将手机/data/data/com.android.providers.contacts/databases下的contacts2.db拷贝到电脑上
- Android 数据库升级中数据保持和导入已有数据库
- Android从Assets拷贝文件以及文件夹到指定目录
- Android 数据库升级数据迁移以及数据库导入
- Android 数据库升级中数据保持和导入已有数据库
- Android从Assets拷贝文件以及文件夹到指定目录
- Android 数据库升级中数据保持和导入已有数据库
- Android编程实现将压缩数据库文件拷贝到安装目录的方法
- android 从data目录拷贝图片到sdcard, Bitmap 转成 image