Android 封裝的數據庫管理操作類

jopen 12年前發布 | 73K 次閱讀 Android 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. 返回一個游標類型
    1. 返回一個List<Object>
    1. 返回一個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();         
      
      }
      }
      } </pre>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!