您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息