樂學成語(1)

  1. 新建數據庫跟表。
  2. 新建項目,在res目錄下新建raw文件夾,將素材中idioms.db數據庫複製到該文件夾下,這是因爲raw文件夾中的東西,Android會原封不動的拷貝到程序中,而不會轉換爲二進制文件。
    在db包下新建一個DBOpenHelper類,代碼如下:
package cn.edu.bztc.happyidiom.db;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.example.happyidom.R;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;
/**
 * 實現將數據庫文件從raw目錄下拷貝到手機裏存放數據庫的位置
 * @author zy
 *
 */
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.happyidom";//應用的包名
    //如可查找應用的包名,????出現的錯誤
    public static final String DB_PATH="/data"
    +Environment.getDataDirectory().getAbsolutePath()+"/"
    +PACKAGE_NAME+"/databases";//在手機存放數據庫的位置
    private Context context;
    public DBOpenHelper(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.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;
    }
}

以上代碼實現的功能主要是使用輸入輸出流將idioms.db複製到手機中默認存放數據庫的位置,爲驗證是否成功搭建單元測試環境,
修改AndroidManifest.xml

 </application>

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.happyidom" >
    </instrumentation>

</manifest>

在test下新DBOpenHelperTestCase

package cn.edu.bztc.happyidiom.test;

import cn.edu.bztc.happyidiom.db.DBOpenHelper;
import android.test.AndroidTestCase;

public class DBOpenHelperTest  extends AndroidTestCase{
    public void testDBCopy(){
        DBOpenHelper dbOpenHelper=new DBOpenHelper(getContext());
        dbOpenHelper.openDatabase();
    }
}

測試效果如下:

  1. src目錄下新建七個包,adapter包用於存放適配器,activity包用於存放頁面活動相關的代碼,dao包用於存放數據操作相關的代碼,db包用於數據庫相關的代碼,util包用於存放所有工具相關的代碼,test包用於存放單元測試類,entity用於存放實體類

    1. 首先在strings.xml頁面定義所需要的文本信息。

      strings.xml頁面內容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">HappyIdom</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="title_study">學習</string>
    <string name="title_search">搜搜</string>
    <string name="title_game">遊戲</string>
    <string name="title_save">收藏</string>
    <string name="title_help">幫助</string>
    <string-array name="category">
        <item>動物類</item>
        <item>自然類</item>
        <item>人物類</item>
        <item>季節類</item>
        <item>數字類</item>
        <item>寓言類</item>
        <item>其他</item>
    </string-array>
    <string-array name="name">
        <item>學習</item>
        <item>搜搜</item>
        <item>遊戲</item>
        <item>收藏</item>
        <item>幫助</item>
    </string-array>
    <string name="title_activity_study">StudyActivity</string>
    <string name="title_activity_study_animal">StudyAnimalActivity</string>
    <string name="title_activity_ma">MaActivity</string>
    <string name="title_activity_query">QueryActivity</string>
</resources>
  1. 在entity實體包下建立相應的Animal類,並建立AnimalDao類,會把一些常用的數據庫操作類封裝起來,方便以後的使用
    AnimalDao代碼如下:
package cn.edu.bztc.happyidiom.dao;
import java.util.ArrayList;
import java.util.List;
import cn.edu.bztc.happyidiom.db.DBOpenHelper;
import cn.edu.bztc.happyidiom.entity.Animal;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.accessibility.AccessibilityNodeInfo;
public class AnimalDao {
    private static AnimalDao animalDao;
    private SQLiteDatabase db;
    /**
     * 將構造方法私有化
     */
    private AnimalDao(Context context){
        DBOpenHelper dbHelper=new DBOpenHelper(context);
        db=dbHelper.openDatabase();
    }
    /**
     * 獲取AnimalDao的示例
     */
    public synchronized static AnimalDao getInstance(Context context){
        if(animalDao==null){
            animalDao=new AnimalDao(context);
        }
        return animalDao;
    }
    /**
     * 從數據庫讀取所有的動物類成語
     */
    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.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;
    }     
}

Animal類代碼如下:

package cn.edu.bztc.happyidiom.entity;
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;
    }
}

編輯單元測試:

package cn.edu.bztc.happyidiom.test;

import java.util.List;

import cn.edu.bztc.happyidiom.dao.AnimalDao;
import cn.edu.bztc.happyidiom.entity.Animal;
import android.test.AndroidTestCase;

public class AnimalTest extends AndroidTestCase {
    public void textGetAllAnimals(){
        AnimalDao animalDao=AnimalDao.getInstance(getContext());
        List<Animal> animals=animalDao.getAllAnimals();
        System.out.println(animals.size());
        for(Animal animal:animals){
            System.out.println(animal.getName());
        }
    }
}

效果圖

發佈了37 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章