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

          做應(yīng)用開發(fā)難免需要用到數(shù)據(jù)庫,而做Android開發(fā)就更加會經(jīng)常使用其自帶的SQLite數(shù)據(jù)庫了,因?yàn)槭褂肧QLite比使用其他方式更加易于管理和操作。下面是我寫的一個數(shù)據(jù)庫操作抽象類,由于Android自帶的SQLite數(shù)據(jù)庫操作類已經(jīng)幫助我們簡化了很多操作,所以這個抽象類主要是為了方便我們建庫和升級庫結(jié)構(gòu)使用的

          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 數(shù)據(jù)庫幫手基類,一個數(shù)據(jù)庫對應(yīng)一個具體實(shí)現(xiàn)。
           *         可以在內(nèi)部定義表名,字段名和各種業(yè)務(wù)邏輯操作等等。
           *         對數(shù)據(jù)庫的增刪改操作,請使用事務(wù)管理。
           *         對數(shù)據(jù)的查詢操作,請?jiān)谑褂肅ursor前,調(diào)用startManagingCursor()方法管理Cursor。
           * 

           
          */

          public abstract class AbstractDatabaseHelper {
              
              
          /**
               * SQLite數(shù)據(jù)庫實(shí)例 
               
          */

              
          protected SQLiteDatabase mDb = null;
              
              
          /**
               * 數(shù)據(jù)庫創(chuàng)建幫手
               
          */

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

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

              
          protected abstract String getDatabaseName();
              
              
          /**
               * 獲得數(shù)據(jù)庫版本,值至少為1。
               * 當(dāng)數(shù)據(jù)庫結(jié)構(gòu)發(fā)生改變的時候,請將此值加1,系統(tǒng)會在初始化時自動調(diào)用
               * createDBTables和dropDBTables方法更新數(shù)據(jù)庫結(jié)構(gòu)。
               * 
          @return
               
          */

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

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

              
          protected abstract String[] dropDBTables();
              
              
          /**
               * 
               * TODO 內(nèi)部數(shù)據(jù)庫創(chuàng)建幫手類
               * 

               
          */

              
          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);
                  }

                  
                  
          /**
                   * 批量執(zhí)行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();
                      }


                  }

                  
              }

              
              
          /**
               * 打開或者創(chuàng)建一個指定名稱的數(shù)據(jù)庫
               * 
          @param dbName
               * 
          @param ctx
               
          */

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

              
              
          /**
               * 關(guān)閉數(shù)據(jù)庫
               
          */

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

              
          }

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

          ---------------------------------------------------------
          專注移動開發(fā)

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

          評論:
          # re: Android開發(fā)小記--開發(fā)實(shí)用工具類--數(shù)據(jù)庫操作類 2010-01-27 16:27 | 過河卒
          我也寫了個類似的東東.呵呵  回復(fù)  更多評論
            
          主站蜘蛛池模板: 重庆市| 高淳县| 广宗县| 池州市| 沽源县| 宜兰县| 桃江县| 疏勒县| 临武县| 龙川县| 页游| 卢湾区| 白朗县| 盐池县| 梁山县| 新化县| 凌云县| 宜宾县| 陆丰市| 临桂县| 黑河市| 饶河县| 抚远县| 府谷县| 木兰县| 大渡口区| 雷山县| 定南县| 涿州市| 台江县| 盐山县| 达孜县| 昔阳县| 正安县| 和硕县| 报价| 肇州县| 呼玛县| 根河市| 洪泽县| 滨海县|