在上一篇博客《打造android ORM框架opendroid(五)——数据更新的实现》 我们介绍了opendroid数据更新的流程,也就在上次,我们OpenDroid类中的所有操作都介绍完了, 那查询操作呢?不是在OpenDroid中?查询操作是在OpenDroid中,不过是以内部类的形式呈现的。
还是来看看如果使用opendroid查询数据吧。
OpenDroid.query.find(Student.class)
OpenDroid.query.columns("stuName").where("_id>?", "1").limit(1, 4).order("_id DESC").find(Student.class);
public static Query query = new Query();
/**
* 查询
* @author qibin
*/
public static class Query {
private String[] mCocumns = null; // 要查询的字段
private String mWhere = null; // 查询的条件
private String[] mWhereArgs = null; // 查询的条件的参数
private String mOrder = null; // order语句
private String mLimit; // limit语句
/**
* 设置查询的字段
* @param columns 要查询的字段
* @return Query对象
*/
public Query columns(String... columns) {
mCocumns = columns;
return this;
}
/**
* 设置查询的where条件
* @param where where条件
* @param whereArgs where参数
* @return Query对象
*/
public Query where(String where, String... whereArgs) {
mWhere = where;
mWhereArgs = whereArgs;
return this;
}
/**
* 设置查询的order
* @param order order语句
* @return Query对象
*/
public Query order(String order) {
mOrder = order;
return this;
}
/**
* 设置查询的limit
* @param limit limit语句
* @return Query对象
*/
public Query limit(int... limit) {
StringBuilder builder = new StringBuilder();
builder.append(limit[0]);
if(limit.length == 2) {
builder.append(",").append(limit[1]);
}
mLimit = builder.toString();
return this;
}
/**
* 查询
* @param klass 映射的bean
* @return 查询结果
*/
public List find(Class klass) {
return CRUD.query(klass, mCocumns, mWhere, mWhereArgs,
mOrder, mLimit, sSqliteDatabase);
}
/**
* 根据id查询数据
* @param klass klass 映射的bean
* @param id 要查询数据的id
* @return 查询结果
*/
public T find(Class klass, int id) {
List result = CRUD.query(klass, mCocumns, "_id=?",
new String[] { String.valueOf(id) }, null, "1",
sSqliteDatabase);
return result.size() > 0 ? result.get(0) : null;
}
public List find(Class klass, int... ids) {
StringBuilder builder = new StringBuilder("_id in (");
String[] whereArgs = new String[ids.length];
buildIn(builder, whereArgs, ids);
return CRUD.query(klass, mCocumns, builder.toString(), whereArgs,
mOrder, mLimit, sSqliteDatabase);
}
/**
* 使用sql语句查询
* @param sql sql语句
* @param selectionArgs 预编译参数
* @return
*/
public Cursor queryBySql(String sql, String[] selectionArgs) {
return sSqliteDatabase.rawQuery(sql, selectionArgs);
}
}
这个内部类中,上来咔咔咔列出了5个字段,注释已经说的很清楚了,其实就是组合查询语句用的。
往下看,我们看到了熟悉的方法,这些都是在上面介绍的时候用到的,并且一些方法的返回值都是this,大家应该很清楚,我们要级联操作嘛,就必须要返回当前对象。
好吧,第一个方法
/**
* 设置查询的字段
* @param columns 要查询的字段
* @return Query对象
*/
public Query columns(String... columns) {
mCocumns = columns;
return this;
}
/**
* 设置查询的where条件
* @param where where条件
* @param whereArgs where参数
* @return Query对象
*/
public Query where(String where, String... whereArgs) {
mWhere = where;
mWhereArgs = whereArgs;
return this;
}
/**
* 设置查询的order
* @param order order语句
* @return Query对象
*/
public Query order(String order) {
mOrder = order;
return this;
}
/**
* 设置查询的limit
* @param limit limit语句
* @return Query对象
*/
public Query limit(int... limit) {
StringBuilder builder = new StringBuilder();
builder.append(limit[0]);
if(limit.length == 2) {
builder.append(",").append(limit[1]);
}
mLimit = builder.toString();
return this;
}
/**
* 查询
* @param klass 映射的bean
* @return 查询结果
*/
public List find(Class klass) {
return CRUD.query(klass, mCocumns, mWhere, mWhereArgs, mOrder, mLimit, sSqliteDatabase);
}
/**
* 查询数据
* @param klass 要映射的类
* @param columns 查询的字段, null 取所有
* @param where where条件, null 忽略条件
* @param whereArgs where的参数, null无参数
* @param order order语句, null忽略order by
* @param limit limit语句, null忽略limit
* @param db 数据库句柄
* @return 查询后的数据
*/
protected static List query(Class klass, String[] columns,
String where, String[] whereArgs, String order, String limit, SQLiteDatabase db) {
List resultList = new ArrayList(); // 存放结果
String tableName = klass.getSimpleName(); // 获取类名(表名)
Cursor cursor = null;
try {
cursor = db.query(tableName, columns, where, whereArgs, null, null, order, limit);
foreachCursor(klass, cursor, resultList);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(cursor != null) {
cursor.close();
}
}
return resultList;
}
/**
* 遍历数据库游标
* @param klass 要映射的类
* @param cursor 要遍历的游标
* @param resultList 存放返回的结果
* @throws InstantiationException
* @throws IllegalAccessException
*/
private static void foreachCursor(Class klass,
Cursor cursor, List resultList) throws InstantiationException,
IllegalAccessException {
T t; // 反射出的实例
String columnName; // 数据库字段名
String methodName; // 方法名
Method m; // 反射出的方法
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()) {
t = klass.newInstance(); // 通过反射进行实例化
for(int i=0;i
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
/**
* 根据字段名构建方法名
* @param columnName
* @return
*/
public static String getMethodName(String columnName) {
String methodName = columnName;
methodName = Character.toUpperCase(methodName.charAt(0)) + methodName.substring(1);
methodName = "set" + methodName;
return methodName;
}
/**
* 根据id查询数据
* @param klass klass 映射的bean
* @param id 要查询数据的id
* @return 查询结果
*/
public T find(Class klass, int id) {
List result = CRUD.query(klass, mCocumns, "_id=?",
new String[] { String.valueOf(id) }, null, "1",
sSqliteDatabase);
return result.size() > 0 ? result.get(0) : null;
}
public List find(Class klass, int... ids) {
StringBuilder builder = new StringBuilder("_id in (");
String[] whereArgs = new String[ids.length];
buildIn(builder, whereArgs, ids);
return CRUD.query(klass, mCocumns, builder.toString(), whereArgs,
mOrder, mLimit, sSqliteDatabase);
}
最后是opendroid的开源地址:http://git.oschina.net/qibin/OpenDroid