Android SQLite 实例—增删改查、数据库版本升级

来源:互联网 发布:网络歌手说唱歌曲大全 编辑:程序博客网 时间:2024/05/01 18:16

大家好,今天給大家带来的是关于android sqlite的一些基本操作,包括数据库创建、数据库版本升级、创建表、数据的增删改查。

首先展示一下demo运行界面(数据库版本1、2):


具体实现思路如下:

  1. 初始化sqlite数据库—SQLiteOpenHelper.onCreate、SQLiteOpenHelper.onUpgrade;
  2. 定义并实现业务逻辑接口—增删该查;
  3. 实际业务调用。

一、初始化数据库

1、定义DataBaseHelper类并继承SQLiteOpenHelper,重写onCreate和onUpgrade两个方法,实现数据库的初始化动作。
/** * 数据库管理 *  * @author 小孩子 2014年2月25日 09:22:45 QQ:1065885952 * */public class DatabaseHelper extends SQLiteOpenHelper {private DatabaseHelper(Context context, String dbName,CursorFactory factory, int version) {super(context, dbName, factory, version);}public DatabaseHelper(Context context, String dbName, int version) {this(context, dbName, null, version);}@Overridepublic void onCreate(SQLiteDatabase db) {System.out.println("DBHelper onCreate");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {System.out.println("DBHelper onUpgrade");try {// // 备份数据库到SD卡的/aDBTest/DBTest.db// CopyDBToSDCard.CopyDB(mContext);for (int i = oldVersion; i < newVersion; i++) {switch (i) {case 1:DatabaseVersionManagement.UpgradedVersion1To2(db);break;default:break;}}} catch (Exception e) {e.printStackTrace();}}}
上述代码中定义了public DatabaseHelper(Context context, String dbName, int version)构造函数,便于外部调用。onCreate为建库动作;onUpgrade函数在数据库版本发生变化的时候,会被触发,进而执行相应的数据库版本升级动作。注:该动作应为自定义。

二、定义并实现业务逻辑接口—增删改查

1、定义业务操作接口

为了方便管理,将系统要调用的数据库操作接口,统一放在BaseInterface.java中。在该类中可根据实际需要,定义适合本身的查询接口。BaseInterface.java代码如下:
/** * 业务操作接口,可自定义适合自己的查询方法 *  * @author 小孩子 2014年2月25日 09:22:45 QQ:1065885952 * */public interface BaseInterface {/** * 新增 *  * @param 新增内容 *            key-value * */abstract void Add(ContentValues values);/** * 更新 *  * @param values *            更新内容 key-value * @param whereClause *            更新条件 例如:id=?,?为通配符 * @param whereArgs *            条件集合 例如:new String[]{"1"} *  * */abstract void Update(ContentValues values, String whereClause,String[] whereArgs);/** * 更新 *  * @param whereClause *            删除条件 例如:id=?,?为通配符 * @param whereArgs *            删除集合 例如:new String[]{"1"} *  * */abstract void Delete(String whereClause, String[] whereArgs);/** * 查询 *  * 必须在Cursor使用之后,才可以关闭数据库连接。 例如:Cursor.moveToNext()执行的时候,才会去查询数据库中是否有数据。 *  * @param columns *            返回列 * @param selection *            查询条件 例如:id=?,?为通配符 * @param selectionArgs *            条件集合 例如: new String[]{"1"} * @param groupBy *            分组 * @param having * @param orderBy *            排序 *  * */abstract Cursor Query(String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy);}
在上述代码中,共定义了4个抽象函数:Add、Update、Delete、Query。注:其中Query方法的返回值,可以根据实际需要,修改成List<T>等通用方法。

2、编写BaseEx类,继承并实现BaseInterface接口

在BaseEx.java类中,除继承并实现BaseInterface接口外,又单独定义了DatabaseHelper、SQLiteDatabase、dbVersion三个参数和openDBConnect、closeDBConnect两个方法,实现了对数据库连接以及数据库版本的管理。具体代码如下:
/** * 业务操作父类,主要负责数据库的打开与关闭,获取数据库版本。 *  * @author 小孩子 2014年2月25日 09:22:45 QQ:1065885952 * */public class BaseEx implements BaseInterface {private DatabaseHelper dbHelper = null;private SQLiteDatabase db = null;private Context mContext = null;private int dbVersion = 1;public BaseEx(Context context) {try {this.mContext = context;this.dbVersion = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;} catch (NameNotFoundException e) {e.printStackTrace();}}public void openDBConnect() {dbHelper = new DatabaseHelper(mContext, Constant.DB_NAME, dbVersion);db = dbHelper.getWritableDatabase();}public void closeDBConnect() {if (db != null) {db.close();}if (dbHelper != null) {dbHelper.close();}}@Overridepublic void Add(ContentValues values) {}@Overridepublic void Update(ContentValues values, String whereClause,String[] whereArgs) {}@Overridepublic void Delete(String whereClause, String[] whereArgs) {}@Overridepublic Cursor Query(String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy) {return null;}public DatabaseHelper getDbHelper() {return dbHelper;}public SQLiteDatabase getDb() {return db;}}

3、具体业务逻辑代码的编写

具体代码在demo中的UserEx.java。针对具体的业务逻辑,实现相应的操作:
/** * User业务操作 *  * @author 小孩子 2014年2月25日 09:22:45 QQ:1065885952 * */public class UserEx extends BaseEx {private final static String TABLENAME = "user";public UserEx(Context context) {super(context);}@Overridepublic void Add(ContentValues values) {try {openDBConnect();getDb().insert(TABLENAME, null, values);} catch (Exception e) {e.printStackTrace();} finally {closeDBConnect();}}@Overridepublic void Update(ContentValues values, String whereClause,String[] whereArgs) {try {openDBConnect();getDb().update(TABLENAME, values, whereClause, whereArgs);} catch (Exception e) {e.printStackTrace();} finally {closeDBConnect();}}@Overridepublic void Delete(String whereClause, String[] whereArgs) {try {openDBConnect();getDb().delete(TABLENAME, whereClause, whereArgs);} catch (Exception e) {e.printStackTrace();} finally {closeDBConnect();}}// 该方法可以修改返回值参数为List<T>或其他自定义返回值,注意关闭数据库连接。@Overridepublic Cursor Query(String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy) {Cursor cursor = null;try {openDBConnect();cursor = getDb().query(TABLENAME, columns, selection,selectionArgs, groupBy, having, orderBy);} catch (Exception e) {e.printStackTrace();} finally {// TODO:关闭数据库连接的动作(super.stopDBConnect()),需在Cursor使用结束之后执行。}return cursor;}}

三、具体业务调用

该部分主要介绍内容为:数据库创建、数据库版本更新、数据表创建、新增、修改、删除、查询操作。

1、数据库创建

思路:初始化DatabaseHelper对象,若数据库不存在,则调用onCreate方法创建数据库。
业务逻辑中的代码为:
class CreateDBListener implements OnClickListener {@Overridepublic void onClick(View v) {try {userEx.openDBConnect();show("建库成功");} catch (Exception e) {e.printStackTrace();show("建库失败" + e.getMessage());} finally {userEx.closeDBConnect();}}}
其中openDBConnect()和closeDBConnect()两个方法被定义在BaseEx中。

2、数据库版本控制

思路:在实例化DatabaseHelper对象的时候,根据传入参数newVersion与当前数据库版本相比较,若newVersion大于oldVersion,则DatabaseHelper.onUpgrade被触发,达到更新数据库版本的目的。
数据库版本升级描述:数据库更新的情况较多,例如:有数据库BDTest,其包含表user(id,name,remark)并又若干条数据,若在此次版本更新中,user表的结构发生变化,假设user表变为(id,name,remark,age),并新增了表org(id,userid,orgcode,orgname)。在这种情况下,可以采用以下几个步骤来实现:
  1. 将数据库中的user表重命名为temp_user;SQL语句为:“alter table user rename to temp_user”。
  2. 新建表user(id,name,remark,age),其中原有字段的结构应与原有字段保持一致;SQL语句为:"create table if not exists user(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(10), remark varchar(50), age varchar(10))"。
  3. 将temp_user表的数据拷贝到user表中,其中新增字段age要用空("")来占位;SQL语句为:“insert into user select id, name, remark, '' from temp_user”。
  4. 最后将临时表temp_user删除;SQL语句为:“drop table if exists temp_user”。
  5. 新增表org;SQL语句为:“creaet table  if not exists org 扒拉扒拉。。”
具体代码如下:
class UpgradeDBListener implements OnClickListener {@Overridepublic void onClick(View v) {try {userEx.openDBConnect();show("版本升级成功");} catch (Exception e) {e.printStackTrace();show("版本升级失败" + e.getMessage());} finally {userEx.closeDBConnect();}}}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {System.out.println("DBHelper onUpgrade");try {// // 备份数据库到SD卡的/aDBTest/DBTest.db// CopyDBToSDCard.CopyDB(mContext);for (int i = oldVersion; i < newVersion; i++) {switch (i) {case 1:DatabaseVersionManagement.UpgradedVersion1To2(db);break;default:break;}}} catch (Exception e) {e.printStackTrace();}}/** * 数据库版本管理 *  * @author 小孩子 2014年2月25日 09:22:45 QQ:1065885952 * */public class DatabaseVersionManagement {/** * 数据库版本升级:1 to 2 *  * */public static void UpgradedVersion1To2(SQLiteDatabase db) {try {db.execSQL("alter table user rename to temp_user");db.execSQL("drop table if exists user");db.execSQL("create table if not exists user(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(10), remark varchar(50), age varchar(10))");db.execSQL("insert into user select id, name, remark, 'age_lala' from temp_user");db.execSQL("drop table if exists temp_user");} catch (Exception e) {e.printStackTrace();}}}
上述代码中未包含org表的创建。

3、新增数据

思路:调用SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)
class InsertTableListener implements OnClickListener {@Overridepublic void onClick(View v) {try {rowNo++;ContentValues values = new ContentValues();values.put("name", "row" + rowNo);values.put("remark", "row" + rowNo);userEx.Add(values);show("新增成功");System.out.println("MainActivity  插入数据" + rowNo);} catch (Exception e) {e.printStackTrace();show("新增失败" + e.getMessage());}}}@Overridepublic void Add(ContentValues values) {try {openDBConnect();getDb().insert(TABLENAME, null, values);} catch (Exception e) {e.printStackTrace();} finally {closeDBConnect();}}

4、修改数据

思路:调用SQLiteDatabase.update(String table, ContentValues values, String whereClause, String[] whereArgs)
class UpdateTableListener implements OnClickListener {@Overridepublic void onClick(View v) {try {ContentValues values = new ContentValues();values.put("remark", mRemark.getText().toString());userEx.Update(values, "id=? and name=?", new String[] { "1","row1" });System.out.println("MainActivity  修改数据1");show("更新成功");} catch (Exception e) {e.printStackTrace();show("更新失败" + e.getMessage());}}}@Overridepublic void Update(ContentValues values, String whereClause,String[] whereArgs) {try {openDBConnect();getDb().update(TABLENAME, values, whereClause, whereArgs);} catch (Exception e) {e.printStackTrace();} finally {closeDBConnect();}}

5、删除数据

思路:调用SQLiteDatabase.delete(String table, String whereClause, String[] whereArgs)

class DeleteTableListener implements OnClickListener {@Overridepublic void onClick(View v) {try {userEx.Delete("id=?", new String[] { mDeleteId.getText().toString() });System.out.println("MainActivity  删除数据id为:"+ mDeleteId.getText().toString());show("删除成功");} catch (Exception e) {e.printStackTrace();show("删除失败" + e.getMessage());}}}@Overridepublic void Delete(String whereClause, String[] whereArgs) {try {openDBConnect();getDb().delete(TABLENAME, whereClause, whereArgs);} catch (Exception e) {e.printStackTrace();} finally {closeDBConnect();}}

6、查询数据

思路:调用SQLiteDatabase.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having,String orderBy)

class QueryTableListener implements OnClickListener {@Overridepublic void onClick(View v) {// // 查询旧版本user表(id,name,remark)// getOldVersionUsers();// 查询新版本user表(id,name,remark,age)getNewVersionsers();}}// 该方法可以修改返回值参数为List<T>或其他自定义返回值,注意关闭数据库连接。@Overridepublic Cursor Query(String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy) {Cursor cursor = null;try {openDBConnect();cursor = getDb().query(TABLENAME, columns, selection,selectionArgs, groupBy, having, orderBy);} catch (Exception e) {e.printStackTrace();} finally {// TODO:关闭数据库连接的动作(super.stopDBConnect()),需在Cursor使用结束之后执行。}return cursor;}

上述部分就是Android SQLite的创建,版本管理,建表,数据操作等一些基本操作介绍。
Demo运行过程:
  1. 修改AndroidManifest.xml的versionCode为1。
  2. 正常进行建库,建表等操作。
  3. 修改AndroidManifest.xml的versionCode为2,并将Query中的代码,替换为getNewVersion()

写在最后

由于本人技术有限,demo中存在很多不足,欢迎朋友们批评指正!!~我的QQ:1065885952

源码下载:SQLiteDemo.zip






0 0