2012-11-17 66 views
0

我正在學習使用this tutorial在Android上使用Sqlite。我無法理解一些代碼。在Android上使用Sqlite

public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_PH_NO + " TEXT" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 
    } 

我在我的活動中創建了一個新的DatabaseHandler對象。構造函數中的超級用戶是SQLiteOpenHelper構造函數。代碼工作的很好,它創建一個新的數據庫,如果沒有的話,它會使用舊數據庫(如果存在的話)。我想對這段代碼做一些修改(我想把不同的表添加到一個數據庫中),但我不明白這個工作到底如何,構造函數是如何知道它應該創建一個新的數據庫還是使用現有的數據庫?

回答

3

訣竅是你的類擴展了SQLiteOpenHelper,在構造函數中調用super會觸發大量的幕後代碼。

如果通過SQLiteOpenHelper source code閱讀你會看到getWritableDatabase()getReadableDatabase()調用相同的方法:SQLiteOpenHelper#getDatabaseLocked()。這種方法完成了大部分工作。它是根據您在一個簡單命令中提供的信息確定是否需要創建,打開,升級或其他任何數據庫的文件:super(context, DATABASE_NAME, null, DATABASE_VERSION);

+0

好的。但是什麼時候創建表的onCreate函數被調用? –

+0

如果沒有數據庫存在,那麼在調用'getWritableDatabase()'後,它只能由SQLiteOpenHelper調用。 – Sam

+0

但是如果想要在現有數據庫中創建新表,該怎麼辦。 –

2

當你想打開你的數據庫,你可以調用SQLiteOpenHelper.getReadableDatabase()或SQLiteOpenHelper.getWriteableDatabase()。如果數據庫存在,這些將返回一個句柄。如果它不存在,系統調用onCreate(),在那裏你執行db.execSQL。

最好是調用DatabaseOpenHelper類而不是DatabaseHandler。它所做的是推遲創建數據庫直到需要它,而不是在其他類的開始創建它。這對於由SQLite數據庫支持的內容提供者特別有用。你應該使用ContentProvider.onCreate()來做非常快速的初始化,然後實現SQLiteOpenHelper.onCreate()來創建數據庫。這樣,系統可以在您的應用程序啓動時加載您的ContentProvider,但在您嘗試訪問它之前,您無需對數據庫執行任何操作。