乐学成语——android(一)

来源:互联网 发布:苹果手机刷windows系统 编辑:程序博客网 时间:2024/04/29 15:55


首先我们先创建如下几个包


其中activity包中用于存放所有活动相关的代码,db包中用于存放所有数据库相关的文件的代码,entity包用于存放所有实体相关的代码,dao包中用于存放数据操作相关的代码,util包用于存放所有工具相关的代码。

在做项目之前我们首先要将数据库文件放在项目中,在res下新建raw文件将idioms.db数据库文件拷入就可以了。

然后再db包下新建一个DBOpenHelper类,代码如下所示:

public class DBOpenHelper {private final int BUFFER_SIZE=400000;public static final String DB_NAME="idioms.db";public static final String PACKAGE_NAME="com.example.happyidiom";public static final String DB_PATH="/data" +Environment.getDataDirectory().getAbsolutePath()+"/" +PACKAGE_NAME+"/databases";private Context context;public DBOpenHelper(Context context) {// TODO Auto-generated constructor stubthis.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.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) {// TODO: handle exceptionLog.e("Datebase", "IO exception");e.printStackTrace();}return null;}}
其主要功能是使用输入输出流将idioms.db复制到手机中默认存放数据库的位置。

搭建单元测试环境,修改AndroidManifest.xml中的代码添加如下代码

<uses-library android:name="android.test.runner" />

<instrumentation        android:name="android.test.InstrumentationTestRunner"        android:targetPackage="com.example.happyidiom" >    </instrumentation>
编写测试类DBOpenHelperTest继承AndroidTestCase代码如下:

public class DBOpenHelperTest extends AndroidTestCase {public void testDBOpen(){DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());dbOpenHelper.openDatabase();}}
进行单元测试后会得到下图所示的结果:



另外,数据库中的Animal表还存在一个对应的实体类,因此我们需要在entity包下新建一个Animal类,代码如下所示:

public class Animal {private int id;private String name;private String pronounce;private String explain;private String antonym;private String homoionym;private String derivation;private String examples;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPronounce() {return pronounce;}public void setPronounce(String pronounce) {this.pronounce = pronounce;}public String getExplain() {return explain;}public void setExplain(String explain) {this.explain = explain;}public String getAntonym() {return antonym;}public void setAntonym(String antonym) {this.antonym = antonym;}public String getHomoionym() {return homoionym;}public void setHomoionym(String homoionym) {this.homoionym = homoionym;}public String getDerivation() {return derivation;}public void setDerivation(String derivation) {this.derivation = derivation;}public String getExamples() {return examples;
}public void setExamples(String examples) {this.examples = examples;}}
</pre><pre name="code" class="java">接着我们还需要创建一个AnimalDao类,这个类将会把一些常用的数据库操作封装起来,以便我们以后的使用,代码如下所示:
<pre name="code" class="java">public class AnimalDao {private static AnimalDao animalDao;private SQLiteDatabase db;//将构造方法私有化private AnimalDao(Context context) {// TODO Auto-generated constructor stubDBOpenHelper dbHelper = new DBOpenHelper(context);db = dbHelper.openDatabase();}//获取AnimalDao的实例  Instance=实例public synchronized static AnimalDao getInstance(Context context){if(animalDao==null){animalDao=new AnimalDao(context);}return animalDao;}//读取数据库中所有的动物类成语/** * Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必须知道每一列的名称。你必须知道每一列的数据类型。Cursor 是一个随机的数据源。所有的数据都是通过下标取得 */public List<Animal> getAllAnimals(){List<Animal> list = new ArrayList<Animal>();Cursor cursor=db.query("animal", null, null, null, null, null, null);if(cursor.moveToFirst()){do{Animal animal=new Animal();animal.setId(cursor.getInt(cursor.getColumnIndex("_id")));animal.setName(cursor.getString(cursor.getColumnIndex("name")));animal.setPronounce(cursor.getString(cursor.getColumnIndex("pronounce")));animal.setExplain(cursor.getString(cursor.getColumnIndex("explain")));animal.setAntonym(cursor.getString(cursor.getColumnIndex("antonym")));animal.setHomoionym(cursor.getString(cursor.getColumnIndex("homoionym")));animal.setDerivation(cursor.getString(cursor.getColumnIndex("derivation")));animal.setExamples(cursor.getString(cursor.getColumnIndex("examples")));list.add(animal);}while(cursor.moveToNext());}return list;}}

编写单元测试类AnimalDaoTest继承 AndroidTextCase,代码如下所示:

public class AnimalDaoTest extends AndroidTestCase {public void testGetAllAnimals(){AnimalDao animalDao = AnimalDao.getInstance(getContext());List<Animal> animals = animalDao.getAllAnimals();System.out.println(animals.size());for(Animal animal:animals){System.out.println(animal.getName());}}}
运行单元测试就会得到下图所示的结果:


1 0
原创粉丝点击