亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候SQLiteOpenHelper onCreate()/ onUpgrade()運行?

什么時候SQLiteOpenHelper onCreate()/ onUpgrade()運行?

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

5 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

SQLiteOpenHelper onCreate()onUpgrade()當數據庫實際上是打開,例如通過將呼叫回調調用getWritableDatabase()。創建數據庫幫助程序對象本身時,不會打開數據庫。

SQLiteOpenHelper版本數據庫文件。版本號是int傳遞給構造函數的參數。在數據庫文件中,版本號存儲在PRAGMA user_version。

onCreate()僅在數據庫文件不存在且剛剛創建時運行。如果onCreate()成功返回(不拋出異常),則假定使用請求的版本號創建數據庫。作為一種暗示,你不應該自己SQLException陷入onCreate()困境。

onUpgrade()僅在數據庫文件存在時調用,但存儲的版本號低于構造函數中請求的版本號。本onUpgrade()應更新表架構所需的版本。

在代碼(onCreate())中更改表模式時,應確保更新數據庫。兩種主要方法:

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

    • 卸載應用程序。使用應用程序管理器或adb uninstall your.package.nameshell。

    • 清除申請數據。使用應用程序管理器。

  2. 增加數據庫版本以便onUpgrade()調用。由于需要更多代碼,這稍微復雜一些。

    • 對于數據丟失不是問題的開發時模式升級,您可以使用execSQL("DROP TABLE IF EXISTS <tablename>")in來刪除現有表并調用onCreate()以重新創建數據庫。

    • 對于已發布的版本,您應該實施數據遷移,onUpgrade()以便用戶不會丟失數據。


查看完整回答
反對 回復 2019-05-21
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

根據Jaskey的要求,在這里進一步添加缺失點


數據庫版本存儲在SQLite數據庫文件中。


catch是構造函數


SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

因此,當使用name(第二個參數)調用數據庫幫助程序構造函數時,平臺會檢查數據庫是否存在,如果數據庫存在,它將從數據庫文件頭獲取版本信息并觸發正確的回調


正如舊答案中已經解釋的那樣,如果名稱的數據庫不存在,則會觸發onCreate。


以下說明onUpgrade以一個例子說明了案例。


比如說,你的第一個版本的應用程序有DatabaseHelper(擴展SQLiteOpenHelper)構造函數傳遞版本1,然后你提供了一個升級的應用程序,其新的源代碼版本傳遞為2,然后在DatabaseHelper構造時自動,平臺onUpgrade通過查看文件已經存在觸發,但版本低于您通過的當前版本。


現在假設您正在計劃將db版本的應用程序的第三個版本作為3(只有在修改數據庫模式時才增加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,那么邏輯將升級數據庫2來3,然后到4


如果舊版本3和新版本4,它只是運行升級的邏輯3來4


查看完整回答
反對 回復 2019-05-21
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

onCreate()

  1. 當我們第一次創建DataBase(即數據庫不存在)時,onCreate()使用傳入的版本創建數據庫SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

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

  3. 如果您已更改代碼并在模擬器中重新啟動,則不會調用此方法。如果要onCreate()運行,則需要使用adb刪除SQLite數據庫文件。

onUpgrade()

  1. SQLiteOpenHelper 應該調用超級構造函數。

  2. onUpgrade()僅當版本整數大于應用程序中運行的當前版本時,才會調用此方法。

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


查看完整回答
反對 回復 2019-05-21
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

可能是我來不及但是我想分享我的簡短回答。請檢查答案 是否存在同樣的問題。它一定會幫到你。沒有更深入的規格。

如果您對創建表的語法有信心,那么當您在同一個表中添加新列時可能會發生這種情況...

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


查看完整回答
反對 回復 2019-05-21
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

擴展時要記住的要點 SQLiteOpenHelper

  1. super(context, DBName, null, DBversion); - 應該調用第一行構造函數

  2. 覆蓋onCreateonUpgrade(如果需要)

  3. onCreate只有當將被調用getWritableDatabase()getReadableDatabase()執行。這只會DBName在第一步中指定的時間不可用時調用一次。您可以在onCreate方法上添加create table query

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


查看完整回答
反對 回復 2019-05-21
  • 5 回答
  • 0 關注
  • 1563 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號