大家好,今天給大家带来的是关于android sqlite的一些基本操作,包括数据库创建、数据库版本升级、创建表、数据的增删改查。
首先展示一下demo运行界面(数据库版本1、2):
具体实现思路如下:
- 初始化sqlite数据库—SQLiteOpenHelper.onCreate、SQLiteOpenHelper.onUpgrade;
- 定义并实现业务逻辑接口—增删该查;
- 实际业务调用。
一、初始化数据库
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)。在这种情况下,可以采用以下几个步骤来实现:
- 将数据库中的user表重命名为temp_user;SQL语句为:“alter table user rename to temp_user”。
- 新建表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))"。
- 将temp_user表的数据拷贝到user表中,其中新增字段age要用空("")来占位;SQL语句为:“insert into user select id, name, remark, '' from temp_user”。
- 最后将临时表temp_user删除;SQL语句为:“drop table if exists temp_user”。
- 新增表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运行过程:
- 修改AndroidManifest.xml的versionCode为1。
- 正常进行建库,建表等操作。
- 修改AndroidManifest.xml的versionCode为2,并将Query中的代码,替换为getNewVersion()
写在最后
由于本人技术有限,demo中存在很多不足,欢迎朋友们批评指正!!