5 回答

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

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
根據(jù)Jaskey的要求,在這里進(jìn)一步添加缺失點(diǎn)
數(shù)據(jù)庫(kù)版本存儲(chǔ)在SQLite數(shù)據(jù)庫(kù)文件中。
catch是構(gòu)造函數(shù)
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
因此,當(dāng)使用name(第二個(gè)參數(shù))調(diào)用數(shù)據(jù)庫(kù)幫助程序構(gòu)造函數(shù)時(shí),平臺(tái)會(huì)檢查數(shù)據(jù)庫(kù)是否存在,如果數(shù)據(jù)庫(kù)存在,它將從數(shù)據(jù)庫(kù)文件頭獲取版本信息并觸發(fā)正確的回調(diào)
正如舊答案中已經(jīng)解釋的那樣,如果名稱的數(shù)據(jù)庫(kù)不存在,則會(huì)觸發(fā)onCreate。
以下說(shuō)明onUpgrade以一個(gè)例子說(shuō)明了案例。
比如說(shuō),你的第一個(gè)版本的應(yīng)用程序有DatabaseHelper(擴(kuò)展SQLiteOpenHelper)構(gòu)造函數(shù)傳遞版本1,然后你提供了一個(gè)升級(jí)的應(yīng)用程序,其新的源代碼版本傳遞為2,然后在DatabaseHelper構(gòu)造時(shí)自動(dòng),平臺(tái)onUpgrade通過(guò)查看文件已經(jīng)存在觸發(fā),但版本低于您通過(guò)的當(dāng)前版本。
現(xiàn)在假設(shè)您正在計(jì)劃將db版本的應(yīng)用程序的第三個(gè)版本作為3(只有在修改數(shù)據(jù)庫(kù)模式時(shí)才增加db版本)。在這種增量升級(jí)中,您必須逐步編寫每個(gè)版本的升級(jí)邏輯,以獲得更好的可維護(hù)代碼
示例偽代碼如下:
@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案例中的缺失語(yǔ)句1和2。這就是增量升級(jí)的意思。
說(shuō),如果舊版本2和新版本4,那么邏輯將升級(jí)數(shù)據(jù)庫(kù)2來(lái)3,然后到4
如果舊版本3和新版本4,它只是運(yùn)行升級(jí)的邏輯3來(lái)4

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

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

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