Android資料庫升級、降級、建立(onCreate() onUpgrade() onDowngrade())的注意點

來源:互聯網
上載者:User

標籤:

以下內容可以作為面試官在面試的時候的問題,感覺比較好,是比較常用的知識點,可以用來考察基礎是否紮實。

也可以程式猿學習、開發中的注意點。因為稍微不注意,就有可能導致資料庫不能用。

DBAdapter.java是一個簡單的類,主要用來進行資料庫操作。

 1 package com.example.test_20131218; 2  3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5  6 public class DBAdapter { 7     private static DBAdapter INSTANCE  = null; 8     private DBOpenHelper mHelper = null; 9     private SQLiteDatabase mDB = null;10     private DBAdapter(Context context){11         mHelper = new DBOpenHelper(context);12         mDB = mHelper.getWritableDatabase();13     }14     public static DBAdapter getInstance(Context context){15         if(INSTANCE == null){16             return new DBAdapter(context);17         }18         return INSTANCE;19     }20     public void open(){21         if(mDB == null){22             mDB = mHelper.getWritableDatabase();23         }24     }25     26 }


DBHelper類:

 1 package com.example.test_20131218; 2  3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 import android.util.Log; 7  8 public class DBOpenHelper extends SQLiteOpenHelper { 9     /***10      * 資料庫的版本必須大於0,否則報錯:11      * java.lang.RuntimeException: Unable to start activity 12      * ComponentInfo{com.example.test_20131218/13      * com.example.test_20131218.MainActivity}: java.lang.IllegalArgumentException: Version must be >= 1, was 014      */15     public static final int DB_VERSION = 5;16     public static final String DB_NAME = "test20131218.db";17     18     public DBOpenHelper(Context context) {19         super(context, DB_NAME, null, DB_VERSION);20     }21 22     @Override23     public void onCreate(SQLiteDatabase db) {24         /**25          * 這個方法26          * 1、在第一次開啟資料庫的時候才會走27          * 2、在清除資料之後再次運行-->開啟資料庫,這個方法會走28          * 3、沒有清除資料,不會走這個方法29          * 4、資料庫升級的時候這個方法不會走30          */31         Log.i("xinye", "#############資料庫建立了##############:" + DB_VERSION);32     }33 34     @Override35     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {36         /**37          * 1、第一次建立資料庫的時候,這個方法不會走38          * 2、清除資料後再次運行(相當於第一次建立)這個方法不會走39          * 3、資料庫已經存在,而且版本升高的時候,這個方法才會調用40          */41         Log.i("xinye", "#############資料庫升級了##############:" + DB_VERSION);42         43     }44     @Override45     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {46         /**47          * 執行資料庫的降級操作48          * 1、只有新版本比舊版本低的時候才會執行49          * 2、如果不執行降級操作,會拋出異常50          */51         Log.i("xinye", "#############資料庫降級了##############:" + DB_VERSION);52         super.onDowngrade(db, oldVersion, newVersion);53     }54 55 }


更多內容請參考大牛部落格對Android文檔的翻譯:http://blog.csdn.net/think_soft/article/details/7969122

也可以自行百度,Google!

下面把大牛的部落格拷貝過來,以便於以後參考:

Android類參考---SQLiteOpenHelper

public 抽象類別

SQLiteOpenHelper

繼承關係

java.lang.Object

   |____android.database.sqlite.SQLiteOpenHelper

類概要

這是一個輔助類,用來管理資料庫的建立和資料庫的版本。

你要建立一個這個類的子類來實現onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法,以及可選的onOpen(SQLiteDatabase)方法,並且這個類要管理資料庫的狀態,如果資料庫存在,就開啟資料庫,否則就建立資料庫,並且在需要的時候也會更新資料庫。使用事務來確保資料庫始終在正確的狀態中。

這個類讓ContentProvider的實現變的容易,它把資料庫的開啟和升級延遲到第一次使用,從而避免了因升級資料庫的長時間運行而造成的應用程式阻塞。

注意:這個類假設用遞增的版本號碼來升級。

Public構造器

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CuresorFactory factory, int version)

   建立一個輔助對象,用來建立、開啟、管理資料庫。這個方法始終是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被調用之前,這個資料庫不會實際的被建立。

   參數說明:

   context:用於開啟或建立資料庫;

   name:指定資料庫的檔案名稱,null指定一個記憶體中的資料庫

   factory:用於建立遊標對象,或預設的null;

   version:指定資料庫的版本號碼(從1開始);如果資料庫比較舊,onUpgrade(SQLiteDatabase, int, int)方法將用於升級資料庫。如果資料庫比較新,onDowngrade(SQLiteDatabase, int, int)方法會被用於降級資料庫。

 

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)

   建立一個輔助對象,用來建立、開啟、管理資料庫。這個方法始終是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被調用之前,這個資料庫不會實際的被建立。

   接收輸入參數:一個具體的DatabaseErrorHandler樣本,用於處理SQLite報告的資料庫錯誤。

   參數說明:

   context:用於開啟或建立資料庫;

   name:指定資料庫的檔案名稱,null指定一個記憶體中的資料庫

   factory:用於建立遊標對象,或預設的null;

   version:指定資料庫的版本號碼(從1開始);如果資料庫比較舊,onUpgrade(SQLiteDatabase, int, int)方法將用於升級資料庫。如果資料庫比較新,onDowngrade(SQLiteDatabase, int, int)方法會被用於降級資料庫。

   errorHandler:該參數被用於SQLite報告資料庫錯誤,或者是null,使用預設錯誤處理器。

 

Public方法

public synchronized void close()

關閉開啟的資料庫物件。

 

public String getDatabaseName()

返回由構造器傳遞進來的,正在開啟的SQLite資料的名稱。

 

public SQLiteDatabase getReadableDatabase()

建立並(或)開啟一個資料庫,除非因為某些問題,否則這個方法返回的對象會與getWritableDatabase()方法相同,如在磁碟空間不足的情況下,就會要求資料庫以唯讀方式被開啟,在這種情況下,會返回一個唯讀資料庫。如果問題被修正,繼續調用getWritableDatabase()方法也可以成功,這時唯讀資料庫物件會被關閉,並且會返回一個讀寫對象。

getWritableDatabase()方法可能需要很長時間才能返回,因此不應該在應用程式的主線程中調用它,包括ContentProvider.onCreate()方法。

傳回值:返回一個資料庫物件,直到getWritableDatabase()或close()方法被調用之前,這個對象都是有效。

異常:如果資料不能夠被開啟,會拋出SQLiteException異常。

 

public SQLiteDatabase getWritableDatabase()

建立並(或)開啟一個用於讀寫的資料庫。如果是首次調用這個方法,那麼該資料將會被開啟,並且onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)和(或)onOpen(SQLiteDatabase)方法會被調用。

資料庫一旦被開啟,該資料庫就會被緩衝,因此在每次需要寫資料庫時,你都能夠調用這個方法。(在不在需要該資料庫時,要確保調用close()方法)。諸如沒有授權或沒有磁碟空間等錯誤可能會導致這個方法調用失敗,但如果這些問題被修正,這個方法就會被調用成功。

注意:資料庫升級可能需要很長時間,因此不要在應用程式的主線程中調用這個方法,包括ContentProvider.onCreate()。

傳回值:一個讀寫的資料庫物件,直到close()方法被調用才失效。

異常:如果該資料庫不能為寫入而開啟,就會拋出SQLiteException異常。

 

public void onConfigure()

在配置資料連線時會調用這個方法,確保預寫記錄檔或外鍵支援等功能可用。

這個方法在onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int),onDowngrade(SQLiteDatabase, int, int)或onOpen(SQLiteDatabase)方法被調用之前被調用。除了配置必要的資料庫連接之外,它不應該編輯資料庫。

這個方法只應該調用設定資料庫串連參數的方法,如enableWriteAheadLogging(),setForeignKeyConstraintsEnabled(boolean),setLocale(Locale),setMaximumSize(long),或者執行PRAGMA語句。

參數:

db:被配置的資料庫物件

 

public abstract void onCreate(SQLiteDatabase db)

資料庫被首次建立時,會調用這個方法。這時建立資料庫表和表初始化的地方。

參數:

db:要建立的資料庫。

 

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

當資料庫需要被降級時,調用這個方法。這個方法與onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在目前的版本比請求的版本新的時候,才會被調用。但是這個方法不是抽象的,因此它不是強制要求客戶實現它的。如果這個方法沒有被重寫,預設的實現會拒絕降級處理,並拋出SQLiteException異常。

這個方法是在事務中執行的。如果有異常被拋出,所有的改變都會被復原。

參數:

db:指定要降級的資料庫

oldVersion:舊的資料庫版本

newVersion:新的資料庫版本

 

public void onOpen(SQLiteDatabase db)

資料庫被開啟時,會調用這個方法。在升級資料庫之前,這個方法的實現應該檢查資料庫是否是唯讀(調用isReadOnly()方法)。

資料庫連接被配置且資料庫策略被建立、升級或必要的降級之後,這個方法會被調用。如果資料庫連接必須在策略被建立、升級或降級前做某些設定,那麼就要在onConfigure(SQLiteDatabase)方法中來做這些事情。

參數:

db:被開啟的資料庫。

 

public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

當資料庫需要升級時,會調用這個方法。應該使用這個方法來實現刪除表、添加表或者做一些需要升級新的策略版本的事情。

SQLite ALTER TABLE的文檔可以在以下網址中找到:

http://sqlite.org/lang_altertable.html

如果要給表添加一個新列,那麼使用使用ALTER TABLE能夠把新列插入到表中。如果要重新命名或刪除列,那麼你能夠使用ALTER TABLE能夠重新命名舊錶,然後,建立一個新表,並把舊錶中內容複寫到新表中。

這個方法是事務中執行的,如果有異常被拋出,所有的改變都會被自動的復原。

參數:

db:指定要降級的資料庫

oldVersion:舊的資料庫版本

newVersion:新的資料庫版本

 

public void setWriteAheadLoggingEnabled(boolean enabled)

啟用或禁用資料庫的預寫記錄檔。預寫記錄檔不能被用於唯讀資料庫,因此如果資料是以唯讀方式被開啟,這個標記值會被忽略。

參數:

enabled:true:啟用預寫記錄檔,false:禁用預寫記錄檔

參照:enableWriteAheadLogging()方法。

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging()

Android資料庫升級、降級、建立(onCreate() onUpgrade() onDowngrade())的注意點

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.