Android 封装的数据库管理操作类

jopen 12年前

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 bindArgs      sql语句中的参数,参数的顺序对应占位符顺序        * @return  result      返回新添记录的行号,与主键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        要插入的数据        * @return  result      返回新添记录的行号,与主键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 bindArgs  sql语句中的参数,参数的顺序对应占位符顺序        */        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 bindArgs  sql语句中的参数,参数的顺序对应占位符顺序        */        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 object                Object的对象        * @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 object                            Object的对象        * @return  List<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();                   }               }           }