在我们的框架中,有一个文件叫做DBTool.java,很明显,是我们用来处理数据库的类。在Android的开发中,我们操作的数据库是SQLite这个小型的数据库,一个小小的手机,当然是装不下MSSQL或者MySQL之类的大家伙,同时,较高的资源消耗也是移动开发中必需要注意的问题,所以一个小巧好用的数据库也就成为了我们的好伙伴!
先汇报一下目前项目的进展,已经做了几天的Model开发,也就是请求接口获取数据。现在大部分的已经写完了,主要是iphone外包公司的效果图还未提交过来,所以我们也只能先进行最底层的开发。等开Tools包中的东西都发上来以后,我们再来研究Model层以及XML的解析。
我们还是先看看完整的代码,然后一一描述。
package hb.hbwb.tools;
import hb.hbwb.finals.DBFinals;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.*;
/**
* @name 数据库相关操作类
* @author zhang.yue
* @create_date 20110512
* @last_edit_author zhang.yue
* @last_edit_date 20111115
* @remark
* @edit_remark 优化代码
*/
public class DBTool {
private Context mCtx = null;
private DatabaseHelper dbHelper = null;
private SQLiteDatabase db = null;
/**
* 构造函数 1
* @param ctx context对象
*/
public DBTool(Context ctx){
this.mCtx = ctx;
}
/**
* 打开数据连接
* @return
* @throws SQLException
*/
public DBTool open() throws SQLException{
dbHelper = new DatabaseHelper(mCtx);
db = dbHelper.getWritableDatabase(); //如果数据库不存在就建立一个,反之存在则根据版本更新
return this;
}
/**
* 关闭数据连接
*/
public void close(){
dbHelper.close();
}
/**
* 列表查询用 1
* @param tableName 表名
* @param strCols 列名
* @param strWhere 条件
* @param strGroupby 分组
* @param strOrderby 排序
* @return 数据指针
*/
public Cursor getAll(String tableName,String[] strCols,String strWhere,String strGroupby,String strOrderby){
return db.query(tableName, //表名
strCols, //列
strWhere, //where语句
null, //where语句的参数
strGroupby, //GROUP by语句
null, //HAVING语句
strOrderby //order by语句
);
}
/**
* 列表查询用 2
* @param sql 传入sql语句直接查询
* @return 数据指针
*/
public Cursor getAll(String sql){
return db.rawQuery(sql, null);
}
/**
* 单个数据查询 1
* @param rowId 数据id
* @param tableName 表名
* @param key 关键字
* @param strCols 列名
* @param strWhere 条件
* @param strGroupby 分组
* @param strOrderby 排序
* @return 单个数据指针
*/
public Cursor get(long rowId,String tableName,String key,String[] strCols,String strWhere,String strGroupby,String strOrderby){
Cursor mCursor = db.query(
tableName,
strCols,
key+"="+rowId,
null,strGroupby,null,strOrderby);
//如果指针存在,就把指针移到第一个条目上
if(mCursor!=null)
mCursor.moveToFirst();
return mCursor;
}
/**
* 单个数据查询 2
* @param sql 传入sql语句直接查询
* @return 单个数据指针
*/
public Cursor get(String sql){
Cursor mCursor =db.rawQuery(sql, null);
//如果指针存在,就把指针移到第一个条目上
if(mCursor!=null)
mCursor.moveToFirst();
return mCursor;
}
/**
* 更新数据
* @param rowId 数据id
* @param tableName 表名
* @param key 更新列名
* @param args 更新数据
* @return 是否更新成功
*/
public boolean update(long rowId,String tableName,String key,ContentValues args){
return db.update(tableName, args, key+"="+rowId, null)>0;
}
/**
* 插入新数据
* @param tableName 表名
* @param args 数据
* @return 成功返回id,失败返回-1
*/
public long create(String tableName,ContentValues args){
// 表名 ,不重要,内容值
return db.insert(tableName, null, args);
}
/**
* 删除数据
* @param rowId 数据id
* @param tableName 表名
* @param key 关键字
* @return 是否删除成功
*/
public boolean delete(long rowId,String tableName,String key){
return db.delete(tableName, key+"="+rowId, null)>0;
}
/**
* @name DBTool内部类,用于创建和更新数据库
* @author zhang.yue
* @create_date 2011-11-15
* @last_edit_author
* @last_edit_date
* @remark
* @edit_remark
*/
public static class DatabaseHelper extends SQLiteOpenHelper{
/**
* 构造函数
* @param context context数据
*/
public DatabaseHelper(Context context) {
// 对象 ,数据库名 ,复杂查询 ,数据库版本
super(context, DBFinals.DATABASE_NAME, null, DBFinals.DBTABASE_VERSION);
}
/**
* 重写onCreate方法,建立数据库
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DBFinals.DBUser.DATABASE_TABLE_USER_CREATE);
}
/**
* 重写onUpgrade方法,根据版本号不同(DBTABASE_VERSION)更新数据库
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+DBFinals.DBUser.DATABASE_TABLE_USER);
onCreate(db);
}
}
}
1、 在这个类中,有一个内部类,叫做DatabaseHelper,继承自SQLiteOpenHelper。SQLiteOpenHelper是Google为我们准备好的用来连接、创建数据库的基类。我们只要重写其中的onCreate和onUpgrade方法,分别是用来创建数据库以及根据版本号更新数据库。建库的语句放在了DBFinals.DBUser.DATABASE_TABLE_USER_CREATE中作为一个常量。
2、 DBTool这个类,是我们用于进行数据库操作的类。
① Open方法:创建DatabaseHelper对象,新建或者更新数据库,他的getWritableDatabase方法的作用是如果数据库不存在就建立一个,反之存在则根据版本更新。
② Close方法:关闭DatabaseHelper对象建立的连接。
③ getAll方法:查询列表,这里重载了这个方法,一个是SQLiteDatabase对象自带的query方法,可以看出分别传入了不同的参数,其实类似于Hibernate或Linq。另一个方法rawQuery则是根据sql语句来进行查询。说实话,自己用后者更多一些!这两个方法返回的均是Cursor类型的指针。需要通过cusor. mCursor.moveToNext()移动指针来获取数据。
④ get方法:类似于查询列表,不过这里直接将返回的指针的第一条数据取了出来,而不是将整个Cursor指针列表返回。同样用两种方式重载。
⑤ update方法:更新数据,使用的是SQLiteDatabase对象自带的update方法,需要按规范传参数,返回布尔值。
⑥ create方法:与update方法类似,返回的是创建后的数据id,失败返回-1。
⑦ delete方法:与update方法类似。
具体的调用方法我们在将来的前台操作中再说,不过心急的朋友可以直接用用试试,基本上都是是网络和各种教程中比较常见的一些方法。
摘自 坏小子