<span style="font-size:32px;"> 首先在eclipse中新建一个Android项目,项目名叫做HappyIdiom,包名叫做cn.edu.bztc.happyidiom,使用的是4.4的API,为了要让项目能够有更好的结构,这里需要在com.edu.bztc.happyidiom包下再新建几个包,如图所示:</span>

其中activity包用于存放所有活动有关的代码,db包用于存放所有数据库相关的代码,entity包用于存放所有实体相关的代码,dao包用于存放数据操作相关的代码,util包用于存放所有工具相关的代码。ADT帮我们自动生成的MainActivity和activity_main.xml文件就不需要了,这里直接将它们删除掉。创建好数据库后,首先在res目录下新建raw目录,将idioms.db数据库复制到此目录下。这是因为raw目录的东西,android会原封不动的拷贝到程序中,而不会转换为二进制文件,在db 包下新建一个DBOpenHelper类,代码如下所示:

/*** 实现将数据库文件从raw目录拷贝到手机里存放数据库的位置* * @author 源*/
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.happyidiom";// 应用的包名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 (NotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}

上面的代码实现的功能主要是使用输入输出流将idioms.db复制到手机中默认存放数据库的位置。但请注意:R.raw.idioms调用的不是系统自带的R文件,而是乐学成语程序中的,否则,系统会报错

究竟有没有复制成功呢?下面搭建单元测试环境,测试数据库有没有创建到指定的路径下面。

首先修改AndroidManifest.xml文件搭建起单元测试的环境。修改后的文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="cn.edu.bztc.happyidiom"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="17" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><uses-library android:name="android.test.runner"/></application><instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="cn.edu.bztc.happyidiom"></instrumentation></manifest>

只要加入上述代码,单元测试环境就搭建起来了。

接下来在test包下,新建DBOpenHelperTest继承AndroidTestCase.代码如下:

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

该类中只封装了一个方法,测试方法通常命名为testXXX()。该方法调用了DBOpenHelper类里面定义的openDatabase()方法。

右击DBOpenHelperTest文件,选择Run as后选择Android JUnit Test进行单元测试。如果出现绿条,代表测试成功,如果测试代码中存在错误,则会出现红条并下方显示出错的原因。

接下来我们看看数据库有没有复制成功,切换到DDMS。我们发现在data/data/应用的包下成功的创建了数据库。如图所示:

另外,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;}}

可以看到,实体类的内容非常简单,基本就是生成数据库表对应字段的get和set方法就可以了。接着我们还需要创建一个AnimalDao类,这个类将会把一些常用的数据库操作封装起来,以方便我们后面使用,代码如下所示:

<pre name="code" class="java">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.setExplain(cursor.getString(cursor.getColumnIndex("examples")));list.add(animal);} while (cursor.moveToNext());}return list;}
}

可以看到,AnimalDao是一个单例类,我们将它的构造方法私有化,并提供了一个getInstance()方法来获取AnimalDao的实例,这样就可以保证全局范围内只会有一个AnimalDao的实例。接下来我们在AnimalDao中提供一个方法getAllAnimals(),该方法用来获取所有的动物类成语。

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

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());}}
}
    <span style="font-size:32px;">运行单元测试,结果如图所示:</span>

好了,第一阶段的代码写到这里就差不多了。

乐学成语实现之一:创建数据库和表相关推荐

  1. oracle创建数据库、表空间、用户并授权

    oracle创建数据库.表空间.用户并授权 在安装完Oracle数据库软件之后可以使用默认的数据库orcl,也可以根据需要创建自定义的数据库.表空间用于对数据库中的资源进行分类,每个用户都有默认的表空 ...

  2. ylb:创建数据库、表,对表的增查改删语句

    ylbtech-SQL Server:SQL Server-创建数据库.表,对表的增查改删语句 SQL Server 创建数据库.表,对表的增查改删语句. 1,ylb:创建数据库.表,对表的增查改删语 ...

  3. 【转】创建数据库和表的SQL语句

    [转]创建数据库和表的SQL语句 创建数据库的SQL语句: 1 create database stuDB 2 on primary -- 默认就属于primary文件组,可省略3 (4 /*--数据 ...

  4. Android studio 关于SQlite数据库导出,创建数据库、表以及如何查看操作

    1.首先,你要确定你的模拟器或手机已经Root,若没有,在你的android SDK的platform-tools目录下打开shell命令行· 如,我的是:C:\Users\10378\AppData ...

  5. oracle实验数据库和表,1oracle创建数据库和表.doc

    1oracle创建数据库和表.doc 实验一:创建数据库和表 一.实验目的 1. 掌握使用DBCA创建数据库 2. 掌握手工创建Oracle数据库的方法 3. 掌握创建数据表的方法 二.实验内容及步骤 ...

  6. PHP教程 数据库和MySQL_PHP教程 - MySQL 创建数据库和表

    PHP MySQL 创建数据库和表 数据库存有一个或多个表. 创建数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库. 语法 CREATE DATABASE database ...

  7. Java实训项目5:GUI学生信息管理系统 - 实现步骤 - 创建数据库与表

    文章目录 七.实现步骤 (一)创建数据库与表 1.创建数据库 2.创建学校表 3.创建状态表 4.创建学生表 5.创建用户表 6.转储SQL文件 七.实现步骤 (一)创建数据库与表 1.创建数据库 在 ...

  8. php里建立数据库和表,PHP 创建数据库和表 | w3cschool菜鸟教程

    PHP 创建数据库和表 数据库存有一个或多个表. 创建数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库. 我们必须添加 CREATE DATABASE 语句到 mysqli ...

  9. 创建数据库、表以及索引

    创建数据库.表以及索引 创建数据库 这样做就可以创建一个数据库: CREATE DATABASE 数据库名称 创建一个表 这样做就可以创建一个数据库中的表: CREATE TABLE 表名称 ( 列名 ...

  10. 【数据库原理实验(openGauss)】创建数据库、表和索引

    创建数据库.表和索引 文章目录 创建数据库.表和索引 一.创建数据库 二.创建与删除模式 三.创建与修改表 (1)创建表 (2)修改表 四.创建与删除索引 (1)创建索引 (2)删除索引 一.创建数据 ...

最新文章

  1. iOS中UITableViewCell的重用问题解决方案
  2. 7.MATLAB变量——矩阵操作二
  3. SparkSQL概述
  4. PsTools在***中的一点小应用
  5. Angular之Error: ExpressionChangedAfterItHasBeenChecked
  6. sonar 质量配置 操作(质量规则)
  7. 1010. 一元多项式求导 (25)-PAT乙级真题
  8. python语言-Python 条件语句
  9. [python]设计模式
  10. 7. JavaScript RegExp 对象
  11. 【游戏引擎Easy2D】三分钟学会游戏的控制移动,键盘识别详解
  12. viper4android脉冲样本,v4a脉冲反馈样本官方版
  13. 学会这120个PS小技巧,工作效率提高5倍!
  14. MATLAB绘制B样条曲线
  15. shiro学习系列:shiro自定义filter过滤器
  16. 计算机游戏本和商务本的区别,商务本和游戏本有什么区别
  17. 游戏金币单位换算管理类
  18. k-fold cross validation 相关的帖子、论文 建议收藏哦 ~
  19. 高通平台开发系列讲解(AtCoP篇)AtCoP架构简介
  20. 周涛教授:从窄门进走出宽路来!

热门文章

  1. 营销型单页企业网站的力量
  2. NodeJs 之模块系统
  3. 3865U软路由开箱及拆机简单体验
  4. 特征提取算法简单学习笔记
  5. Android 支付功能
  6. 微信小程序例子——鼠标拖动效果
  7. 数据挖掘学习小组简介!
  8. 美团简单版动态线程池源码实现
  9. AI TIME 走进企业 | 携手清华大学佛山先进制造研究院走进AI企业
  10. Ceph手动部署(开发版本)