您的位置:首页 > 移动开发 > Android开发

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

2014-03-18 12:26 330 查看
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,出现如下图所示:



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

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



好了,大家尝试自己去学习一下吧,欢迎交流分享,一起学习进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: