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
3、搭建我们的Android单元测试环境,在AndroidMainifest.xml中加入如下代码:
在中加入:
在与同级别加入:
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数据存储及单元测试

则表示我们的环境配置成功,我们输入adb shell就可以进入我们的linux命令行,进行我们的linux相关操作,
ls -l:即可查看相关目录,cd 相应的文件名称,即可进入相关目录,当我们查看目录看到我们的创建的数据库test.db时候,我们可以使用sqlite3 test.db即可进入相应的sqlite操作:.schema:查看创建的表语句和创建的表,也可以使用我们的sql操作语句,见下图:

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

分类:默认分类 时间:2012-01-06 人气:7
本文关键词:
分享到:

相关文章

  • 从零开始学android(数据存储(4)Sqlite数据库存储.三十八.) 2012-02-19

    从前几章我们分别学习了属性文件存储输数据,内储存存储数据,和外部储存存储数据,今天我们来学习一下android 轻量级数据库Sqlite数据库的数据存储 首先必须了解SQLiteOpenHelper SQLiteDatabase类本身只是一个数据库的操作类,但是如果要想进行数据库的操作,还需要一个android.database.sqlite.SQLiteOpenHelper类帮助下才可以取得进行,但是,SQLiteOpenHelper类是一个抽象类,所以要使用的时候需要定义其子类,并且在子类中

  • Android SQLite开发教程(2): android.database.sqlite类定义 2014-07-12

    和通常的RDBMS不同的是,Sqlite 是以库函数的形式提供的,而不是以单独的进程来提供数据库服务(如Desktop平台上SQL Server,这样做的效果是,由应用程序创建的SQLite数据库成为应用的一个部分,从而降低了外部依赖,减小数据访问的延迟,简化了数据的事务处理时的同步和锁定操作。 在Android平台上SQLite 支持定义在android.database.sqlite (其实是Android系统中SQLite C函数的Java接口),其主要的类和接口的类关系图如下: 其中Co

  • Android开发之Android体系架构介绍 2012-07-17

    在Android中,整个框架由应用、应用框架、原生库、Android实时库、硬件抽象层、Linux内核等若干部分组成。 其中最核心的Android虚拟机部分也已经开放源码。对开发者而言,如果期望在深度定制的基础上开发出差异化、高度竞争力的产品,需要在应用框架、原生库、硬件抽象层、Linux内核等方面有较深入的理解。图1显示了Android的体系架构。 图1 Android体系架构 1、核心服务 所谓Android的核心服务主要包括熵服务(Entropy Service)、电源管理器(Power

  • Android入门系列一(Android学习方法) 2013-12-13

    Android学习方法 一:了解什么是Android 二: 建立开发环境 三: 阅读SDK文档 四: 背景知识 1、Java 2、面向对象 3、设计模式 4、J2ME、Brew、Symbian 先说说什么是Android; 1、Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于便携设备,如智能手机和平板电脑。它包括一个操作系统,中间件和一些重要的应用程序。Beta版的Android SDK提供了在Android平台上使用Java语言进行Android应用开发必须的工具和A

  • 每一位Android开发者应该知道的Android体系架构和开发库 2013-12-15

      Android 的体系架构鼓励组件重用,允许开发者发布共享 Activity、Service 并且访问其他应用程序的数据,还可以根据开发者制定的安全限制进行管理。话虽如此,今天我将分享一些关于 Android 架构和开发库信息,供开发者创建下一个杀手级应用使用。准备好了吗?请继续下面的阅读!   不要被上面的图片吓到,你无需了解所有内容。   Android 架构支持开发者创建自己的联系人应用或者电话拨号程序。你可以公布自己应用的组件,让其他开发者在此基础上创建新的用户界面,进行功能扩展或者

  • android学习十二(android的Content Provider(内容提供器)的使用) 2014-01-24

    文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中访问和存储数据。内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前使用内容提供器是android实现跨程序共享数据的标准方式。内容提供器可以选择只对一部分数据进行共享,从而保证我们的程序中的隐私数据不会有泄漏的风险。 内容提供器的用法一般有两种,一种是使用现有的内容提

  • Android开发学习之一--Android全景概述 2014-06-26

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于便携设备,如智能手机和平板电脑。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良随后,逐渐扩展到平板电脑及其他领域上。2008年10月第一部Android智能手机发布。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年11月数据显示,A

  • Android实践--如何提高Android模拟器的运行速度 2012-02-20

    Android---如何提高模拟器的速度 做Android开发的程序猿们,很多人心中有一纠结:“Android模拟器怎么这么慢啊,用自己的爱机测试有点小小不舍”,谷歌推出的adt-bundle-windows-x86在省去了Android程序猿辛苦安装adt插件的时候还是没有直接解决Android模拟器的速度上的劣势,就在这一点上有点输给了Mac上的ios,今天袁老师悄悄地来揭晓谷歌ADT中的一个小秘密--如何提高模拟器的速度。 ADT默认的器模拟的是 ARM 的体系结构(arm-eabi),这

  • Android实践--Android Http 客户端编程之GET 2012-02-25

    Android Http 客户端编程之GET 说起Http编程,不尽然想起GET和POST两种请求方式,本文以简洁明了的的步骤和说明,将Android中常用的Http编程的方式列举出来,给刚刚在Android路上起步的奋斗者参考和指引,希望快速上手应用Android Http编程的同仁可以先绕过下面一段话。 做一件事之前,我们是否能驻足想一下要做这件事,我们需要做哪些工作,然后在经验中积累出模板思路和步骤,在程序界通常用设计模式来概括这些工作良好的解决方案。有了这些总结积累,这样我们就能举一反三

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.123 (s). 10 q(s)