Android 封装的数据库管理操作类
import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteStatement;import android.util.Log;/** * 数据库管理类,具备增删改查操作。 * 增删改 --> 操作一个sql语句,并且有返回值。 * 查询 --> 1. 返回一个游标类型 * 2. 返回一个List<Object> * 3. 返回一个List<Map<String, Object>> * @author zxy * 时间: 2012-09-28 */public class DataBaseManager {private DBHelper dbHelper;public static DataBaseManager instance = null;private SQLiteDatabase sqliteDatabase;/** * 构造函数 * @param context上下文对象 */private DataBaseManager(Context context) {dbHelper = new DBHelper(context);sqliteDatabase = dbHelper.getReadableDatabase();}/*** * 获取本类对象实例 * @param context上下文对象 * @return */public static final DataBaseManager getInstance(Context context) {if (instance == null) instance = new DataBaseManager(context);return instance;}/** * 关闭数据库 */public void close() {if(sqliteDatabase.isOpen()) sqliteDatabase.close();if(dbHelper != null) dbHelper.close();if(instance != null) instance = null;}/** * 插入数据 * @param sql 执行更新操作的sql语句 * @param bindArgssql语句中的参数,参数的顺序对应占位符顺序 * @returnresult返回新添记录的行号,与主键id无关 */public Long insertDataBySql(String sql, String[] bindArgs) throws Exception{long result = 0;if(sqliteDatabase.isOpen()){SQLiteStatement statement = sqliteDatabase.compileStatement(sql);if(bindArgs != null){int size = bindArgs.length;for(int i = 0; i < size; i++){//将参数和占位符绑定,对应statement.bindString(i+1, bindArgs[i]);}result = statement.executeInsert();statement.close();}}else{Log.i("info", "数据库已关闭");}return result;}/** * 插入数据 * @param table 表名 * @param values要插入的数据 * @returnresult 返回新添记录的行号,与主键id无关 */public Long insertData(String table, ContentValues values){long result = 0;if(sqliteDatabase.isOpen()){result = sqliteDatabase.insert(table, null, values);}return result;}/** * 更新数据 * @param sql 执行更新操作的sql语句 * @param bindArgssql语句中的参数,参数的顺序对应占位符顺序 */public void updateDataBySql(String sql, String[] bindArgs) throws Exception{if(sqliteDatabase.isOpen()){SQLiteStatement statement = sqliteDatabase.compileStatement(sql);if(bindArgs != null){int size = bindArgs.length;for(int i = 0; i < size; i++){statement.bindString(i+1, bindArgs[i]);}statement.execute();statement.close();}}else{Log.i("info", "数据库已关闭");}}/** * 更新数据 * @param table表名 * @param values表示更新的数据 * @param whereClause表示SQL语句中条件部分的语句 * @param whereArgs表示占位符的值 * @return */public int updataData(String table, ContentValues values, String whereClause, String[] whereArgs){int result = 0;if(sqliteDatabase.isOpen()){result = sqliteDatabase.update(table, values, whereClause, whereArgs);}return result;}/** * 删除数据 * @param sql 执行更新操作的sql语句 * @param bindArgssql语句中的参数,参数的顺序对应占位符顺序 */public void deleteDataBySql(String sql, String[] bindArgs) throws Exception{if(sqliteDatabase.isOpen()){SQLiteStatement statement = sqliteDatabase.compileStatement(sql);if(bindArgs != null){int size = bindArgs.length;for(int i = 0; i < size; i++){statement.bindString(i+1, bindArgs[i]);}Method[] mm = statement.getClass().getDeclaredMethods();for (Method method : mm) {Log.i("info", method.getName());/** * 反射查看是否能获取executeUpdateDelete方法 * 查看源码可知 executeUpdateDelete是public的方法,但是好像被隐藏了所以不能被调用, * 利用反射貌似只能在root以后的机器上才能调用,小米是可以,其他机器却不行,所以还是不能用。 */}statement.execute();statement.close();}}else{Log.i("info", "数据库已关闭");}}/** * 删除数据 * @param table表名 * @param whereClause表示SQL语句中条件部分的语句 * @param whereArgs表示占位符的值 * @return */public int deleteData(String table, String whereClause, String[] whereArgs){int result = 0;if(sqliteDatabase.isOpen()){result = sqliteDatabase.delete(table, whereClause, whereArgs);}return result;}/** * 查询数据 * @param searchSQL 执行查询操作的sql语句 * @param selectionArgs查询条件 * @return 返回查询的游标,可对数据自行操作,需要自己关闭游标 */public Cursor queryData2Cursor(String sql, String[] selectionArgs) throws Exception{if(sqliteDatabase.isOpen()){Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);if (cursor != null) {cursor.moveToFirst();}return cursor;}return null;}/** * 查询数据 * @param sql执行查询操作的sql语句 * @param selectionArgs查询条件 * @param objectObject的对象 * @return List<Object>返回查询结果 */public List<Object> queryData2Object(String sql, String[] selectionArgs, Object object) throws Exception{List<Object> mList = new ArrayList<Object>();if(sqliteDatabase.isOpen()){Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);Field[] f;if(cursor != null && cursor.getCount() > 0) {while(cursor.moveToNext()){f = object.getClass().getDeclaredFields();for(int i = 0; i < f.length; i++) {//为JavaBean 设值invokeSet(object, f[i].getName(), cursor.getString(cursor.getColumnIndex(f[i].getName())));}mList.add(object);}}cursor.close();}else{Log.i("info", "数据库已关闭");}return mList;}/** * 查询数据 * @param sql执行查询操作的sql语句 * @param selectionArgs查询条件 * @param objectObject的对象 * @returnList<Map<String, Object>> 返回查询结果 * @throws Exception */public List<Map<String, Object>> queryData2Map(String sql, String[] selectionArgs, Object object)throws Exception{List<Map<String, Object>> mList = new ArrayList<Map<String,Object>>();if(sqliteDatabase.isOpen()){Cursor cursor = sqliteDatabase.rawQuery(sql, selectionArgs);Field[] f;Map<String, Object> map;if(cursor != null && cursor.getCount() > 0) {while(cursor.moveToNext()){map = new HashMap<String, Object>();f = object.getClass().getDeclaredFields();for(int i = 0; i < f.length; i++) {map.put(f[i].getName(), cursor.getString(cursor.getColumnIndex(f[i].getName())));}mList.add(map);}}cursor.close();}else{Log.i("info", "数据库已关闭");}return mList;} /** * java反射bean的set方法 * @param objectClass * @param fieldName * @return */ @SuppressWarnings("unchecked") public static Method getSetMethod(Class objectClass, String fieldName) { try { Class[] parameterTypes = new Class[1]; Field field = objectClass.getDeclaredField(fieldName); parameterTypes[0] = field.getType(); StringBuffer sb = new StringBuffer(); sb.append("set"); sb.append(fieldName.substring(0, 1).toUpperCase()); sb.append(fieldName.substring(1)); Method method = objectClass.getMethod(sb.toString(), parameterTypes); return method; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 执行set方法 * @param object 执行对象 * @param fieldName属性 * @param value值 */ public static void invokeSet(Object object, String fieldName, Object value) { Method method = getSetMethod(object.getClass(), fieldName); try { method.invoke(object, new Object[] { value }); } catch (Exception e) { e.printStackTrace(); } } }