第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

什么時(shí)候SQLiteOpenHelper onCreate()/ onUpgrade()運(yùn)行?

什么時(shí)候SQLiteOpenHelper onCreate()/ onUpgrade()運(yùn)行?

蕪湖不蕪 2019-05-21 13:32:17
什么時(shí)候SQLiteOpenHelper onCreate()/ onUpgrade()運(yùn)行?我已經(jīng)在我的桌子上創(chuàng)建了我的桌子SQLiteOpenHelper onCreate()但收到了SQLiteException: no such table要么SQLiteException: no such column錯(cuò)誤。為什么?
查看完整描述

5 回答

?
Cats萌萌

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ù)。兩種主要方法:

  1. 刪除舊的數(shù)據(jù)庫(kù)文件,以便onCreate()再次運(yùn)行。在開發(fā)時(shí),您通常首選這種方法,您可以控制已安裝的版本,并且數(shù)據(jù)丟失不是問(wèn)題。刪除數(shù)據(jù)庫(kù)文件的一些方法:

    • 卸載應(yīng)用程序。使用應(yīng)用程序管理器或adb uninstall your.package.nameshell。

    • 清除申請(qǐng)數(shù)據(jù)。使用應(yīng)用程序管理器。

  2. 增加數(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ù)。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
叮當(dāng)貓咪

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


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
紫衣仙女

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

onCreate()

  1. 當(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)

  2. onCreate()方法是創(chuàng)建您定義的表并執(zhí)行您編寫的任何其他代碼。但是,只有在應(yīng)用程序的數(shù)據(jù)目錄(/data/data/your.apps.classpath/databases)中缺少SQLite文件時(shí),才會(huì)調(diào)用此方法。

  3. 如果您已更改代碼并在模擬器中重新啟動(dòng),則不會(huì)調(diào)用此方法。如果要onCreate()運(yùn)行,則需要使用adb刪除SQLite數(shù)據(jù)庫(kù)文件。

onUpgrade()

  1. SQLiteOpenHelper 應(yīng)該調(diào)用超級(jí)構(gòu)造函數(shù)。

  2. onUpgrade()僅當(dāng)版本整數(shù)大于應(yīng)用程序中運(yùn)行的當(dāng)前版本時(shí),才會(huì)調(diào)用此方法。

  3. 如果要onUpgrade()調(diào)用該方法,則需要在代碼中增加版本號(hào)。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
至尊寶的傳說(shuō)

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。)


查看完整回答
反對(duì) 回復(fù) 2019-05-21
?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

擴(kuò)展時(shí)要記住的要點(diǎn) SQLiteOpenHelper

  1. super(context, DBName, null, DBversion); - 應(yīng)該調(diào)用第一行構(gòu)造函數(shù)

  2. 覆蓋onCreateonUpgrade(如果需要)

  3. onCreate只有當(dāng)將被調(diào)用getWritableDatabase()getReadableDatabase()執(zhí)行。這只會(huì)DBName在第一步中指定的時(shí)間不可用時(shí)調(diào)用一次。您可以在onCreate方法上添加create table query

  4. 每當(dāng)您想要添加新表時(shí),只需更改DBversion并在onUpgrade表中執(zhí)行查詢,或者只是卸載然后安裝應(yīng)用程序。


查看完整回答
反對(duì) 回復(fù) 2019-05-21
  • 5 回答
  • 0 關(guān)注
  • 1571 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)