<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(3622) 評論(1)  編輯  收藏 所屬分類: JavaAndroid

    評論:
    # re: Android開發小記--開發實用工具類--數據庫操作類 2010-01-27 16:27 | 過河卒
    我也寫了個類似的東東.呵呵  回復  更多評論
      
    主站蜘蛛池模板: 337p日本欧洲亚洲大胆艺术| 蜜桃成人无码区免费视频网站 | 久久久无码精品亚洲日韩蜜桃| 午夜视频在线观看免费完整版 | 337p日本欧洲亚洲大胆精品555588| 亚洲国产精品自在拍在线播放| 毛片免费视频播放| 日韩精品在线免费观看| 一级一级一片免费高清| 亚洲JIZZJIZZ妇女| 亚洲AV成人影视在线观看| 亚洲第一成年人网站| 亚洲国产精品久久久久久| 亚洲线精品一区二区三区 | 亚洲欧洲日产v特级毛片| 国产亚洲综合成人91精品 | 特黄特色的大片观看免费视频| 亚洲精品第一国产综合亚AV| 亚洲偷自精品三十六区| 亚洲天堂中文字幕在线观看| 亚洲今日精彩视频| 国产亚洲3p无码一区二区| 亚洲乱码中文字幕综合| 国产美女亚洲精品久久久综合| 亚洲AV成人潮喷综合网| 亚洲AV无码专区日韩| 亚洲成人一区二区| 免费a级黄色毛片| xvideos亚洲永久网址| 国产乱子影视频上线免费观看| 国产精品国产免费无码专区不卡 | 亚洲午夜国产精品无码| 中文字幕久久亚洲一区| 亚洲中文字幕无码一区二区三区| 国产成人亚洲影院在线观看| 亚洲伊人久久成综合人影院| 亚洲中文字幕无码一久久区| 亚洲AV无码成人专区片在线观看| 亚洲AV永久无码精品| 亚洲黄色在线观看视频| 亚洲自国产拍揄拍|