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操作语句,见下图:


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