2012-09-03 88 views
10

我正在製作一個數據庫應用程序,並且我的程序能夠正常工作,並且我已經瞭解了我一直遵循的大部分教程。但是,我仍然不清楚一個方面。SQLiteOpenHelper - 數據庫是如何創建的?

有一個擴展SQLiteOpenHelper的MyDBHelper內部類。 外部變量包括名爲d的SQLiteDatabase。 MyDBHelper的代碼是:

private static class MyDBHelper extends SQLiteOpenHelper { 
     MyDBHelper(Context c) { 
      super(c, DB_NAME, null, DB_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      try { 
       db.execSQL(DATABASE_CREATE); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) { 
      Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data."); 
      db.execSQL("DROP TABLE IF EXISTS GM"); 
      onCreate(db); 
     } 
    } 

我的問題是如何實際創建初始數據庫。它發生在onCreate()方法中,但據我所知,這是永遠不會調用。我知道它是在第一次創建數據庫時調用的,但是在哪裏?此外,它是如何通過SQLiteDatabase數據庫?我沒有將任何數據庫傳遞給該方法。我的SQLiteDatabase數據庫變量是如何從外部類設置爲創建的數據庫?有人可以通過這個像白癡一樣談論我嗎?

回答

7

onCreate()onUpgrade()方法確實是第一次創建Db時。 事實上,它在getReadableDatabase() or getWritebleDatabase()方法SQLiteOpenHelper中檢查。它會檢查數據庫中是否已經存在數據庫,它的版本是什麼。據此,它將要麼撥打onCreate(), or onUpgrade()。或者沒有,如果db文件存在並且版本正確。

您可以搜索您的代碼以執行myDBHelper.getReadable(Writable)Database()。這是執行此項檢查的時間。

請讓我知道是否需要更多細節。祝你好運

0

也許,在getReadableDatabase()getWriteableDatabase()時,他們被稱爲首次


3

請您擴展SQLiteOpenHelper的頭腦,所有的魔法發生在這個超級類,特別是數據庫當您致電getReadableDatabase()getWritableDatabase()時,最初創建(或剛剛重新打開)。這兩種方法:

  • 致電onCreate(db)方法或打開現有的數據庫
  • 初始化db定義SQLiteDatabase db變量(和控制通過db到您的回調方法)
  • 檢查版本號,並致電onUpgrade(db)onDowngrade(db)如有必要

他們還調用一些更多的回調方法,如onConfigure(db),onOpen(db)等(關於這些方法,請參考Read more)。如果有幫助,您可以自己通讀the source code以瞭解所有這些情況發生的時間和結構。

1

onCreate()方法不是此類的構造函數。在創建數據庫時調用onCreate。

這裏PeopleDB擴展SQLiteOpenHelper。此代碼是從不同的類,當getWritableDatabase()或getReadableDatabase(),或諸如此類的事稱爲

PeopleDB db = null; //onCreate NOT called here 
    db=new PeopleDB(getContext()); 
    db.getWritableDatabase(); //onCreate is called here! 

希望幫助的onCreate被調用。

1

查看我們的數據庫是在openhelper的構造函數本身中創建的,而不是覆蓋onCreate方法。在onCreate方法中,我們發起了一個查詢,在數據庫中創建一個表,該數據庫是在開放幫助器的構造函數中創建的,用於插入不創建數據庫的數據。

還有一件事是SQLiteDatabase對象沒有在SQLiteOpenHelper類中實例化。它在您希望使用數據庫執行數據庫操作的類中實例化,您需要編寫這樣的函數來初始化或打開數據庫以準備插入。

SQLiteDatabase database; 

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that 

    public void open() throws SQLException { 
      database = profiloHelper.getWritableDatabase(); 
     } 

這裏是你必須寫在像插入刪除任何數據庫的任何操作的代碼,你只需要更改查詢

SQLiteStatement insert_stmt = null; 

     try { 
      insert_stmt = database.compileStatement(YOUR_QUERY); 

      insert_stmt.bindString(1, field1); 
      insert_stmt.bindString(2, field2); 
      insert_stmt.executeInsert(); 
     } 
     finally { 
      if (insert_stmt != null) insert_stmt.close(); 
     } 
0

創建實施的onCreate(SQLiteDatabase)的子類,onUpgrade( SQLiteDatabase,int,int)和可選的onOpen(SQLiteDatabase),並且該類負責打開數據庫(如果存在),創建數據庫(如果不存在),並根據需要進行升級。 (Android開發人員網站)

0

類別SQLiteOpenHelper被稱爲「助手」是有充分理由的。它爲我們的應用程序作者節省了大量的工作

首次您致電​​(或getReadableDatabase)爲您實現SQLiteOpenHelper,在你的構造你的super語句將當前Context和數據庫NAME你喜歡父類的構造爲SQLiteOpenHelper

然後,超類構造函數爲您的SQLiteDatabase設置初始空間,併爲其指定通過super傳遞的名稱。

完成後,超類構造函數調用onCreate並傳遞它通過onCreate的唯一參數創建的名爲SQLiteDatabase。由於onCreate只有一次被調用,所以這是一個非常好的地方,可以調用execSQL來定義數據庫的結構。

getReadableDatabase(或​​)的後續執行僅爲您打開數據庫並且不會再次致電onCreate。 (當父類的構造指出,super已經發出了不同的版本號,onUpgrade是卡萊。)

理解方式SQLiteOpenHelper無明顯的代碼和如何赫克onCreate被傳遞的參數「出於藍」是創建一個數據庫對我來說真正的瑣事。現在我不敢相信它可能會很難。

相關問題