在上一篇博客《打造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 <T extends OpenDroid> List<T> find(Class<T> klass) { return CRUD.query(klass, mCocumns, mWhere, mWhereArgs, mOrder, mLimit, sSqliteDatabase); } /** * 根据id查询数据 * @param klass klass 映射的bean * @param id 要查询数据的id * @return 查询结果 */ public <T extends OpenDroid> T find(Class<T> klass, int id) { List<T> result = CRUD.query(klass, mCocumns, "_id=?", new String[] { String.valueOf(id) }, null, "1", sSqliteDatabase); return result.size() > 0 ? result.get(0) : null; } public <T extends OpenDroid> List<T> find(Class<T> 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 <T extends OpenDroid> List<T> find(Class<T> 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 <T extends OpenDroid> List<T> query(Class<T> klass, String[] columns, String where, String[] whereArgs, String order, String limit, SQLiteDatabase db) { List<T> resultList = new ArrayList<T>(); // 存放结果 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 <T extends OpenDroid> void foreachCursor(Class<T> klass, Cursor cursor, List<T> 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<cursor.getColumnCount();i++) { columnName = cursor.getColumnName(i); // 获取数据库字段名 try { switch (cursor.getType(i)) { case Cursor.FIELD_TYPE_INTEGER: // 如果字段名是_id的话, 对应的方法是setId methodName = columnName.equals("_id") ? "setId" : getMethodName(cursor.getColumnName(i)); m = klass.getMethod(methodName, int.class); // 反射出方法 m.invoke(t, cursor.getInt(i)); // 执行方法 break; case Cursor.FIELD_TYPE_FLOAT: methodName = getMethodName(cursor.getColumnName(i)); m = klass.getMethod(methodName, float.class); m.invoke(t, cursor.getFloat(i)); break; default: methodName = getMethodName(cursor.getColumnName(i)); m = klass.getMethod(methodName, String.class); m.invoke(t, cursor.getString(i)); break; } }catch(Exception e) { e.printStackTrace(); } } resultList.add(t); } }
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 extends OpenDroid> T find(Class<T> klass, int id) { List<T> result = CRUD.query(klass, mCocumns, "_id=?", new String[] { String.valueOf(id) }, null, "1", sSqliteDatabase); return result.size() > 0 ? result.get(0) : null; }
public <T extends OpenDroid> List<T> find(Class<T> 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
打造android ORM框架opendroid(六)——级联查询
原文地址:http://blog.csdn.net/qibin0506/article/details/43370135