导入:
我们平时见到的android数据库操作一般都是在程序开始时创建一个空的数据库,然后再进行相关操作。这个我们就比较好做了,因为这个数据库是我们一开始就跟着这个应用走的,那么我们有的时候不可能什么都是自己去做的。我们要是需要使用一个已有数据的数据库怎么办呢?大家想一想在android系统下数据库应该存放在什么地方呐,我们要是知道数据库存放在什么地方就好办了,现在大家有没有思路了。没有的话,就跟我们dev慢慢的来做。我们知道android的数据库存放在/data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下。操作方法是用FileInputStream读取原数据库,再用 FileOutputStream把读取到的东西写入到那个目录。这样就可以了,大家这回明白了吧,那么我就来看看在代码中是怎么实现的。
Step1:把原数据库包括在项目源码的res/raw目录下,然后建立一个DBHelper类
/**
* 实现将数据库文件从raw目录拷贝到手机里存放数据库的位置
* @author Administrator
*/
public class DBHelper {
private final int BUFFER_SIZE = 400000;
public static final String DB_NAME = "idiom.db"; // 保存的数据库文件名
public static final String PACKAGE_NAME = "com.bzu.happyidiom.controller";// 应用的包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() +"/"
+ PACKAGE_NAME+ "/databases"; // 在手机里存放数据库的位置
//sdcard的路径
//public static final String DB_PATH = Environment.getExternalStorageDirectory().getAbsolutePath()+"/idiom";
private Context context;
public DBHelper(Context context) {
this.context = context;
}
public SQLiteDatabase openDatabase() {
try {
File myDataPath = new File(DB_PATH);
if (!myDataPath.exists())
{
myDataPath.mkdirs();// 如果没有这个目录则创建
}
String dbfile=myDataPath+"/"+DB_NAME;
if (!(new File(dbfile).exists())) {// 判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
InputStream is = context.getResources().openRawResource(
R.raw.idiom); // 欲导入的数据库
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
null);
return db;
} catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
} catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
return null;
}
}
Step2:搭建单元测试环境,测试数据库有没有创建到指定的路径下面
public class IdiomDaoTest extends AndroidTestCase {
public void testCreateDB(){
DBHelper dbHelper=new DBHelper(getContext());
dbHelper.openDatabase();
}
}