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操作语句,见下图:
好了,大家尝试自己去学习一下吧,欢迎交流分享,一起学习进步!