以下內容可以作為面試官在面試的時候的問題,感覺比較好,是比較常用的知識點,可以用來考察基礎是否扎實。
也可以程序猿學習、開發中的注意點。因為稍微不注意,就有可能導致數據庫不能用。
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 0 14 */ 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 @Override 23 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 @Override 35 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 @Override 45 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()方法。