Android应用中少不了数据库的应用,这次的乐学成语的完成,因为牵扯到需要显示大部分的动物成语的显示,所以要事先准备动物类成语的数据库(这里用事先准备好的数据库进行乐学成语上的应用)
1.首先在res目录下新建raw目录,将事先准备好的数据库复制到这个目录下(因为在raw目录的东西,Android会原封不动的拷贝到程序中,而不会转换为二进制文件);
2.建一个db包,在包下新建一个DBOpenHelper类,代码主要实现使用输入输出流将数据库idioms.db复制到手机中默认存放数据库的位置,代码如下:
<span style="font-size:14px;">package cn.edu.bztc.happyldiom.db;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import cn.edu.bztc.happyldiom.R;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;
public class DBOpenHelper {
private final int BUFFER_SIZE = 400000;// 缓冲区大小
public static final String DB_NAME = "idioms.db";// 保存的数据库文件名
public static final String PACKAGE_NAME = "cn.edu.bztc.happyldiom";// 应用的包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME +"/databases";// 在手机里存放数据库的位置
private Context context;
public DBOpenHelper(Context context) {
this.context = context;
Log.i("file",DB_PATH);
}
public SQLiteDatabase openDatabase(){
try{
File myDataPath=new File(DB_PATH);
if(!myDataPath.exists()){
myDataPath.mkdirs();//如果没有目录则创建
}
String dbfile=myDataPath.getAbsolutePath()+"/"+DB_NAME;
System.out.println(dbfile);
if(!(new File(dbfile).exists())){//判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库</span>
<span style="font-size:14px;"> InputStream is=context.getResources().openRawResource(R.raw.idioms);
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;
}
}
</span>
3.搭建测试环境测试数据库到底有没有创建到指定的路径下,首先修改AndroidManifest.xml文件搭建起测试环境,修改如下(添加这两句话):
<span style="font-size:14px;"><application
......
<user-library android:name="android.test.runner"/>
</application></span><pre name="code" class="java"><span style="font-size:14px;"> <instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.edu.bztc.happyldiom" >
</instrumentation></span>
4.这样测试环境搭建起来之后,建test包,包中新建DBOpenHelperTest继承AndroidTestCase,代码如下:
<span style="font-size:14px;">package cn.edu.bztc.happyldiom.test;
import cn.edu.bztc.happyldiom.db.DBOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
public class DBOpenHelperTest extends AndroidTestCase{
public void testDBCopy(){ //封装方法testDBCopy()用于测试
DBOpenHelper dbopenhelper =new DBOpenHelper(getContext());
SQLiteDatabase d = dbopenhelper.openDatabase();//调用了DBOpenHelper类里面定义的openDatabase()方法
System.out.println(d.getVersion());
}
}
</span>
5.右击DBOpenHelperTest文件,Run as 后选择Android JUnit Test进行单元测试,若出现图中绿条则测试成功,然后看一下数据库有没有复制成功,切换到DDMS,可以发现在data/data/应用下成功创建了数据库,如图: