隨筆-348  評論-598  文章-0  trackbacks-0

          做應用開發難免需要用到數據庫,而做Android開發就更加會經常使用其自帶的SQLite數據庫了,因為使用SQLite比使用其他方式更加易于管理和操作。下面是我寫的一個數據庫操作抽象類,由于Android自帶的SQLite數據庫操作類已經幫助我們簡化了很多操作,所以這個抽象類主要是為了方便我們建庫和升級庫結構使用的

          import android.content.Context;
          import android.database.sqlite.SQLiteDatabase;
          import android.database.sqlite.SQLiteOpenHelper;
          import android.database.sqlite.SQLiteDatabase.CursorFactory;
          import android.util.Log;
          /**
           * TODO 數據庫幫手基類,一個數據庫對應一個具體實現。
           *         可以在內部定義表名,字段名和各種業務邏輯操作等等。
           *         對數據庫的增刪改操作,請使用事務管理。
           *         對數據的查詢操作,請在使用Cursor前,調用startManagingCursor()方法管理Cursor。
           * 

           
          */

          public abstract class AbstractDatabaseHelper {
              
              
          /**
               * SQLite數據庫實例 
               
          */

              
          protected SQLiteDatabase mDb = null;
              
              
          /**
               * 數據庫創建幫手
               
          */

              
          protected CreateDBHelper mDbHelper = null;
              
              
          /**
               * 獲得當前數據庫幫手類標識(一般是該類名稱),用于日志等的記錄
               * 
          @return
               
          */

              
          protected abstract String getTag();
              
              
          /**
               * 獲得數據庫名稱
               * 
          @return
               
          */

              
          protected abstract String getDatabaseName();
              
              
          /**
               * 獲得數據庫版本,值至少為1。
               * 當數據庫結構發生改變的時候,請將此值加1,系統會在初始化時自動調用
               * createDBTables和dropDBTables方法更新數據庫結構。
               * 
          @return
               
          */

              
          protected abstract int getDatabaseVersion();
              
              
          /**
               * 創建數據庫表的SQL語句,一個元素一條語句
               * 
          @return
               
          */

              
          protected abstract String[] createDBTables();
              
              
          /**
               * 刪除數據庫表的SQL語句,一個元素一條語句
               * 
          @return
               
          */

              
          protected abstract String[] dropDBTables();
              
              
          /**
               * 
               * TODO 內部數據庫創建幫手類
               * 

               
          */

              
          private class CreateDBHelper extends SQLiteOpenHelper
              
          {
                  
          public CreateDBHelper(Context ctx)
                  
          {
                      
          super(ctx, getDatabaseName(), null, getDatabaseVersion());
                  }

                  @Override
                  
          public void onCreate(SQLiteDatabase db) {
                      
          // TODO Auto-generated method stub
                      executeBatch(createDBTables(), db);
                  }


                  @Override
                  
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                      
          // TODO Auto-generated method stub
                      Log.w(getTag(), "Upgrading database '" + getDatabaseName() + "' from version " + oldVersion + " to " + newVersion);
                      executeBatch(dropDBTables(), db);
                      onCreate(db);
                  }

                  
                  
          /**
                   * 批量執行Sql語句
                   * 
          @param sqls
                   * 
          @param db
                   
          */

                  
          private void executeBatch(String[] sqls, SQLiteDatabase db)
                  
          {
                      
          if(sqls == null)
                          
          return;
                      
                      db.beginTransaction();
                      
          try
                      
          {
                          
          int len = sqls.length;
                          
          for(int i = 0; i < len; i++)
                          
          {
                              db.execSQL(sqls[i]);
                          }

                          db.setTransactionSuccessful();
                      }
          catch(Exception e){
                          Log.e(getTag(), e.getMessage(), e);
                      }
          finally{
                          db.endTransaction();
                      }


                  }

                  
              }

              
              
          /**
               * 打開或者創建一個指定名稱的數據庫
               * 
          @param dbName
               * 
          @param ctx
               
          */

              
          public void open(Context ctx)
              
          {
                  Log.i(getTag(), 
          "Open database '" + getDatabaseName() + "'");
                  mDbHelper 
          = new CreateDBHelper(ctx);
                  mDb 
          = mDbHelper.getWritableDatabase();
              }

              
              
          /**
               * 關閉數據庫
               
          */

              
          public void close()
              
          {
                  
          if(mDbHelper != null)
                  
          {
                      Log.i(getTag(), 
          "Close database '" + getDatabaseName() + "'");
                      mDbHelper.close();
                  }
              
              }

              
          }

          如果想使用這個類,你需要編寫一個子類繼承此類并實現相應的抽象方法(主要是返回一些字符串),同時可以在內部定義表名,字段名和各種業務邏輯操作(CRUD)等等。這樣子類在被初始化并open之后,就會自動檢查數據庫是否被創建以及數據庫版本是否匹配,如果沒有被創建,則會自動被創建;如果版本變化了,則會自動調用onUpgrade方法,升級數據庫表結構。雖然此類簡化的工作量不多,但我們可以將它作為一個主體,基于這個主體,再根據業務,就可以實現更豐富的功能了。

          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2009-03-07 00:30 TiGERTiAN 閱讀(3623) 評論(1)  編輯  收藏 所屬分類: Java 、Android

          評論:
          # re: Android開發小記--開發實用工具類--數據庫操作類 2010-01-27 16:27 | 過河卒
          我也寫了個類似的東東.呵呵  回復  更多評論
            
          主站蜘蛛池模板: 万载县| 汨罗市| 枣强县| 全椒县| 屏东县| 崇义县| 碌曲县| 辽宁省| 肇庆市| 越西县| 曲靖市| 盈江县| 广南县| 宾阳县| 道孚县| 玛多县| 琼结县| 九龙坡区| 江达县| 榕江县| 会泽县| 平原县| 黄浦区| 桓仁| 仲巴县| 永丰县| 宁陕县| 烟台市| 伊吾县| 孟州市| 凯里市| 鸡泽县| 高密市| 南开区| 随州市| 哈密市| 丰台区| 广平县| 高尔夫| 肇东市| 大余县|