Android之旅十二 Android中的SQLite数据存储及单元测试

     android中的另一种存储方式就是使用sqlite,SQLite是一个嵌入式数据库引擎,针对于内存资源有限的设备提供一种高效的数据库引擎,它不像我们的mysql、sqlserver、oracle等数据库,它没有服务器进程,所有的内容包含在同一个单文件中,该文件是跨平台的,可以自由复制,下来带大家来进入我们的学习旅程吧!

我们在进行sqlite操作数据的时候,使用的一个主要的类就是SQLiteDatabase,它提供了对数据的查询、新增、修改等各种方法,我们在使用的时候一般和它的一个帮助类SQLiteOpenHelper一起结合使用,SQLiteOpenHelper用于管理数据库的创建和版本的更新,一般写一个类来继承它,代码如下,都有相应的注释,我相信大家都能够看懂:

1、创建MyDBHelper用来管理数据库:

package com.xin.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper {

	private static final int VERSION=1;

	//创建表的语句
	private static final String CREATE_TABLE_SQL="create table tb_user" +
			"(u_id integer primary key autoincrement,u_name varchar(50),u_pwd varchar(50))";
	
    //构造方法
	public MyDBHelper(Context context, String dbName, CursorFactory factory,
			int version) {
		super(context, dbName, factory, version);
	}
	
	//构造方法,创建数据库
	public MyDBHelper(Context context, String dbName,int version){
		this(context,dbName,null,version);
	}
	
	//构造方法,创建数据库
	public MyDBHelper(Context context,String dbName) {
		super(context, dbName, null, VERSION);
	}
	

	//创建数据库时调用
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_TABLE_SQL);
	}

	//版本更新时候调用
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("数据库已更新版本为:"+newVersion);
	}

}

2、创建DBUtils辅助类来对数据进行增删查改:

package com.xin.db;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBUtils {
	private Context context;
	//数据库名称
	private static final String DB_NAME="test.db";
	//表名称
	private static final String TABLE_NAME="tb_user";

	public DBUtils(Context context){
		this.context=context;
	}
	
	/**
	 * 创建数据库,onCreate方法得到调用
	 * 此时数据库的版本号为1
	 */
	public void createDB(){
		MyDBHelper dbHelper=new MyDBHelper(context,DB_NAME);
		//调用下面的方法,onCreate方法才得以执行,就是说表才开始创建
		SQLiteDatabase db=dbHelper.getReadableDatabase();
	}
	
	/**
	 * 更新数据库版本,将其变为2
	 * onUpgrade方法得到调用 
	 */
	public void updateDB(){
		MyDBHelper dbHelper=new MyDBHelper(context,DB_NAME,2);
		SQLiteDatabase db=dbHelper.getReadableDatabase();
	}
	
	/**
	 * 插入数据
	 */
	public void insert(){
		MyDBHelper dbHelper=new MyDBHelper(context,DB_NAME);
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		//第一种插入数据的方法,直接执行sql语句
		String sql="insert into tb_user values(3,'wuxin','123456')";
		db.execSQL(sql);
		//第二种插入数据的方法,使用ContentValues
		ContentValues values=new ContentValues();
		//put的键为数据库的字段名称,值为相应数据类型的值
		values.put("u_id", 4);
		values.put("u_name", "mary");
		values.put("u_pwd", "hello");
		//表名称、values为null的时候将null字段插入数据库、values值
		db.insert(TABLE_NAME, null, values);
	}
	
	/**
	 * 更新数据
	 */
	public void update(){
		MyDBHelper dbHelper=new MyDBHelper(context,DB_NAME);
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		//第一种更新数据的方法
		String sql="update tb_user set u_name='jack' where u_id=1";
		db.execSQL(sql);
		//第二种更新数据的方法
		ContentValues values=new ContentValues();
		values.put("u_pwd", "world");
		//表名称、要更新的values值、where子句、where子句中的?占位符所对应的字符串参数
		db.update(TABLE_NAME, values, "u_id=?", new String[]{"2"});
	}
	
	/**
	 * 查询数据
	 */
	public void query(){
		MyDBHelper dbHelper=new MyDBHelper(context,DB_NAME);
		//因为只需要进行查询操作,不需要对数据库进行写入,所以用ReadableDatabase
		SQLiteDatabase db=dbHelper.getReadableDatabase();
		//表名称、要查询的字段数组、where子句、where子句中的?占位符所对应的字符串参数、group by分组子句、having子句、order by子句
		//Cursor cursor=db.query(TABLE_NAME, new String[]{"u_id","u_name","u_pwd"}, "u_id=?", new String[]{"2"}, null, null, null);
		//查询所有数据
		Cursor cursor=db.query(TABLE_NAME, null, null, null, null, null, null);
		while(cursor.moveToNext()){
			int u_id=cursor.getInt(cursor.getColumnIndex("u_id"));
			String u_name=cursor.getString(cursor.getColumnIndex("u_name"));
			String u_pwd=cursor.getString(cursor.getColumnIndex("u_pwd"));
			System.out.println("u_id="+u_id+",u_name="+u_name+",u_pwd="+u_pwd);
		}
		
		//第二种遍历方式
		if(cursor.moveToFirst()){//判断是否为空
			for(int i=0;i<cursor.getCount();i++){
				cursor.move(i);
				int u_id=cursor.getInt(0);
				String u_name=cursor.getString(1);
				String u_pwd=cursor.getString(2);
				System.out.println("u_id="+u_id+",u_name="+u_name+",u_pwd="+u_pwd);
			}
		}
	}
	
	/**
	 * 删除数据
	 */
	public void delete(){
		MyDBHelper dbHelper=new MyDBHelper(context,DB_NAME);
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		//第一种删除数据的方式,使用sql语句
		String sql="delete from tb_user where u_id=1";
		db.execSQL(sql);
		//第二种删除数据的方式,表名、where子句、where子句中的?占位符所对应的字符串参数
		db.delete(TABLE_NAME, "u_id=?", new String[]{"2"});
	}
}

3、搭建我们的Android单元测试环境,在AndroidMainifest.xml中加入如下代码:

在<application></application>中加入: <uses-library android:name="android.test.runner"/>

在与<application>同级别加入:

    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="com.xin.test" --编写测试类的包名称
                     android:label="android test"/>

4、测试类的环境搭建好了,下面我们在项目中新建一个com.xin.test包(用户可以自己配置,但是需要在上面的环境中的android:targetPackage进行修改),在下新建了一个DBTest.java的测试类:

package com.xin.test;

import com.xin.db.DBUtils;

import android.test.AndroidTestCase;
import android.util.Log;

/**
 * 数据库操作测试类
 * @author HarderXin
 *
 */
public class DBTest extends AndroidTestCase{
	private static final String TAG="DBTest";
	
	//测试创建数据库
	public void testCreateDB(){
		DBUtils dbUtils=new DBUtils(this.getContext());
		dbUtils.createDB();
		Log.i(TAG, "数据库创建成功!");
	}
	
	//测试更新数据库
	public void testUpdateDB(){
		DBUtils dbUtils=new DBUtils(this.getContext());
		dbUtils.updateDB();
		Log.i(TAG, "数据库更新成功!");
	}
	
	//测试插入数据
	public void testInsert(){
		DBUtils dbUtils=new DBUtils(this.getContext());
		dbUtils.insert();
		Log.i(TAG, "数据插入成功!");
	}
	
	//测试更新数据
	public void testUpdate(){
		DBUtils dbUtils=new DBUtils(this.getContext());
		dbUtils.update();
		Log.i(TAG, "数据更新成功!");
	}
	
	//测试查询数据
	public void testQuery(){
		DBUtils dbUtils=new DBUtils(this.getContext());
		dbUtils.query();
		Log.i(TAG, "数据查询成功!");
	}
	
	//测试删除数据
	public void testDelete(){
		DBUtils dbUtils=new DBUtils(this.getContext());
		dbUtils.delete();
		Log.i(TAG, "数据删除成功!");
	}

}

我们在进行这些测试类的时候,需要先启动AVD模拟器,然后点击Run as-->Android Junit Test,然后就可以进行相应的测试了,我们在测试类中有个Log.i();这是为了方便我们进行调试而写的,我们可以在LogCat中查看相应的输出信息。

创建数据库后,我们可以打开File exploer文件查看器查看我们当前AVD下所创建的数据库,它是放在/data/data/我们定义的包名/databases/test.db,我创建的数据库名称为test.db,然后我们可以将这个文件导出来,使用相应的软件打开查看里面的信息!

除此之外,我们还可以使用命令符使用adb命令对其进行查看和操作,它可以让我们对android中的项目进行调试,如果要在命令窗口中使用adb命令符,需要在环境变量中进行配置,在path中添加:D:\android-sdk\platform-tools,然后在命令窗口中输入命令:adb,出现如下图所示:

Android之旅十二 Android中的SQLite数据存储及单元测试_第1张图片

则表示我们的环境配置成功,我们输入adb shell就可以进入我们的linux命令行,进行我们的linux相关操作,

ls -l:即可查看相关目录,cd 相应的文件名称,即可进入相关目录,当我们查看目录看到我们的创建的数据库test.db时候,我们可以使用sqlite3 test.db即可进入相应的sqlite操作:.schema:查看创建的表语句和创建的表,也可以使用我们的sql操作语句,见下图:

Android之旅十二 Android中的SQLite数据存储及单元测试_第2张图片


好了,大家尝试自己去学习一下吧,欢迎交流分享,一起学习进步!


 

 

你可能感兴趣的:(Android之旅十二 Android中的SQLite数据存储及单元测试)