標籤:
以下內容可以作為面試官在面試的時候的問題,感覺比較好,是比較常用的知識點,可以用來考察基礎是否紮實。
也可以程式猿學習、開發中的注意點。因為稍微不注意,就有可能導致資料庫不能用。
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())的注意點