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

大家好,今天給大家带来的是关于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);

	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		System.out.println("DBHelper onCreate");
	}

	@Override
	public 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();
		}
	}

	@Override
	public void Add(ContentValues values) {

	}

	@Override
	public void Update(ContentValues values, String whereClause,
			String[] whereArgs) {

	}

	@Override
	public void Delete(String whereClause, String[] whereArgs) {

	}

	@Override
	public 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);
	}

	@Override
	public void Add(ContentValues values) {
		try {
			openDBConnect();

			getDb().insert(TABLENAME, null, values);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDBConnect();
		}
	}

	@Override
	public void Update(ContentValues values, String whereClause,
			String[] whereArgs) {
		try {
			openDBConnect();

			getDb().update(TABLENAME, values, whereClause, whereArgs);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDBConnect();
		}
	}

	@Override
	public void Delete(String whereClause, String[] whereArgs) {
		try {
			openDBConnect();

			getDb().delete(TABLENAME, whereClause, whereArgs);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDBConnect();
		}
	}

	// 该方法可以修改返回值参数为List<T>或其他自定义返回值,注意关闭数据库连接。
	@Override
	public 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 {

		@Override
		public 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 {

		@Override
		public void onClick(View v) {
			try {
				userEx.openDBConnect();

				show("版本升级成功");
			} catch (Exception e) {
				e.printStackTrace();
				show("版本升级失败" + e.getMessage());
			} finally {
				userEx.closeDBConnect();
			}

		}

	}

@Override
	public 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 {

		@Override
		public 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());
			}

		}

	}

@Override
	public 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 {

		@Override
		public 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());
			}
		}
	}

@Override
	public 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 {

		@Override
		public 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());
			}
		}
	}

@Override
	public 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 {

		@Override
		public void onClick(View v) {

			// // 查询旧版本user表(id,name,remark)
			// getOldVersionUsers();

			// 查询新版本user表(id,name,remark,age)
			getNewVersionsers();
		}
	}

// 该方法可以修改返回值参数为List<T>或其他自定义返回值,注意关闭数据库连接。
	@Override
	public 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
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值