5 回答

TA貢獻1805條經(jīng)驗 獲得超9個贊
SQLiteOpenHelper
onCreate()
而onUpgrade()
當數(shù)據(jù)庫實際上是打開,例如通過將呼叫回調(diào)調(diào)用getWritableDatabase()
。創(chuàng)建數(shù)據(jù)庫幫助程序?qū)ο蟊旧頃r,不會打開數(shù)據(jù)庫。
SQLiteOpenHelper
版本數(shù)據(jù)庫文件。版本號是int
傳遞給構造函數(shù)的參數(shù)。在數(shù)據(jù)庫文件中,版本號存儲在PRAGMA user_version
。
onCreate()
僅在數(shù)據(jù)庫文件不存在且剛剛創(chuàng)建時運行。如果onCreate()
成功返回(不拋出異常),則假定使用請求的版本號創(chuàng)建數(shù)據(jù)庫。作為一種暗示,你不應該自己SQLException
陷入onCreate()
困境。
onUpgrade()
僅在數(shù)據(jù)庫文件存在時調(diào)用,但存儲的版本號低于構造函數(shù)中請求的版本號。本onUpgrade()
應更新表架構所需的版本。
在代碼(onCreate()
)中更改表模式時,應確保更新數(shù)據(jù)庫。兩種主要方法:
刪除舊的數(shù)據(jù)庫文件,以便
onCreate()
再次運行。在開發(fā)時,您通常首選這種方法,您可以控制已安裝的版本,并且數(shù)據(jù)丟失不是問題。刪除數(shù)據(jù)庫文件的一些方法:卸載應用程序。使用應用程序管理器或
adb uninstall your.package.name
shell。清除申請數(shù)據(jù)。使用應用程序管理器。
增加數(shù)據(jù)庫版本以便
onUpgrade()
調(diào)用。由于需要更多代碼,這稍微復雜一些。對于數(shù)據(jù)丟失不是問題的開發(fā)時模式升級,您可以使用
execSQL("DROP TABLE IF EXISTS <tablename>")
in來刪除現(xiàn)有表并調(diào)用onCreate()
以重新創(chuàng)建數(shù)據(jù)庫。對于已發(fā)布的版本,您應該實施數(shù)據(jù)遷移,
onUpgrade()
以便用戶不會丟失數(shù)據(jù)。

TA貢獻1776條經(jīng)驗 獲得超12個贊
根據(jù)Jaskey的要求,在這里進一步添加缺失點
數(shù)據(jù)庫版本存儲在SQLite數(shù)據(jù)庫文件中。
catch是構造函數(shù)
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
因此,當使用name(第二個參數(shù))調(diào)用數(shù)據(jù)庫幫助程序構造函數(shù)時,平臺會檢查數(shù)據(jù)庫是否存在,如果數(shù)據(jù)庫存在,它將從數(shù)據(jù)庫文件頭獲取版本信息并觸發(fā)正確的回調(diào)
正如舊答案中已經(jīng)解釋的那樣,如果名稱的數(shù)據(jù)庫不存在,則會觸發(fā)onCreate。
以下說明onUpgrade以一個例子說明了案例。
比如說,你的第一個版本的應用程序有DatabaseHelper(擴展SQLiteOpenHelper)構造函數(shù)傳遞版本1,然后你提供了一個升級的應用程序,其新的源代碼版本傳遞為2,然后在DatabaseHelper構造時自動,平臺onUpgrade通過查看文件已經(jīng)存在觸發(fā),但版本低于您通過的當前版本。
現(xiàn)在假設您正在計劃將db版本的應用程序的第三個版本作為3(只有在修改數(shù)據(jù)庫模式時才增加db版本)。在這種增量升級中,您必須逐步編寫每個版本的升級邏輯,以獲得更好的可維護代碼
示例偽代碼如下:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
//upgrade logic from version 1 to 2
case 2:
//upgrade logic from version 2 to 3
case 3:
//upgrade logic from version 3 to 4
break;
default:
throw new IllegalStateException(
"onUpgrade() with unknown oldVersion " + oldVersion);
}
}
注意break案例中的缺失語句1和2。這就是增量升級的意思。
說,如果舊版本2和新版本4,那么邏輯將升級數(shù)據(jù)庫2來3,然后到4
如果舊版本3和新版本4,它只是運行升級的邏輯3來4

TA貢獻1839條經(jīng)驗 獲得超15個贊
onCreate()
當我們第一次創(chuàng)建DataBase(即數(shù)據(jù)庫不存在)時,
onCreate()
使用傳入的版本創(chuàng)建數(shù)據(jù)庫SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
方法是創(chuàng)建您定義的表并執(zhí)行您編寫的任何其他代碼。但是,只有在應用程序的數(shù)據(jù)目錄(/data/data/your.apps.classpath/databases
)中缺少SQLite文件時,才會調(diào)用此方法。如果您已更改代碼并在模擬器中重新啟動,則不會調(diào)用此方法。如果要
onCreate()
運行,則需要使用adb刪除SQLite數(shù)據(jù)庫文件。
onUpgrade()
SQLiteOpenHelper
應該調(diào)用超級構造函數(shù)。onUpgrade()
僅當版本整數(shù)大于應用程序中運行的當前版本時,才會調(diào)用此方法。如果要
onUpgrade()
調(diào)用該方法,則需要在代碼中增加版本號。

TA貢獻1789條經(jīng)驗 獲得超10個贊
可能是我來不及但是我想分享我的簡短回答。請檢查答案 是否存在同樣的問題。它一定會幫到你。沒有更深入的規(guī)格。
如果您對創(chuàng)建表的語法有信心,那么當您在同一個表中添加新列時可能會發(fā)生這種情況...
1)從您的設備卸載并再次運行。
要么
2)設置 - > app - > ClearData
要么
3)更改DATABASE_VERSION
“DatabaseHandler”類(如果添加了新列,則會自動升級)
public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);}
要么
4)改變DATABASE_NAME
你的“DatabaseHandler”類(我遇到了同樣的問題。但是我通過改變成功了DATABASE_NAME
。)

TA貢獻2080條經(jīng)驗 獲得超4個贊
擴展時要記住的要點 SQLiteOpenHelper
super(context, DBName, null, DBversion);
- 應該調(diào)用第一行構造函數(shù)覆蓋
onCreate
和onUpgrade
(如果需要)onCreate
只有當將被調(diào)用getWritableDatabase()
或getReadableDatabase()
執(zhí)行。這只會DBName
在第一步中指定的時間不可用時調(diào)用一次。您可以在onCreate
方法上添加create table query每當您想要添加新表時,只需更改
DBversion
并在onUpgrade
表中執(zhí)行查詢,或者只是卸載然后安裝應用程序。
添加回答
舉報