package com.esandinfo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class MySQLiteOpenHelper extends SQLiteOpenHelper { public static MySQLiteOpenHelper mySQLiteOpenHelper; private static final String DB_NAME = "person_info.db"; private static final int VERSION = 1; public synchronized static MySQLiteOpenHelper getInstance(Context context) { if (null == mySQLiteOpenHelper) { mySQLiteOpenHelper = new MySQLiteOpenHelper(context, DB_NAME, null, VERSION); } return mySQLiteOpenHelper; } /** * 當開發者調用 getReadableDatabase(); 或者 getWritableDatabase(); * 就會經過此構造方法配置的信息 來建立 person_info.db 數據庫 * 因此此構造方法的配置信息,能夠認爲是給建立 person_info.db 數據庫 準備的 * * @param context 上下文 * @param name 數據庫名 * @param factory 遊標工廠 * @param version 版本,最低爲1 */ private MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } /** * 此方法是什麼時候調用? ,是須要開發者調用 getReadableDatabase(); 或者 getWritableDatabase(); * * 注意:此onCreate方法只會被執行一次,由於當開發者調用 getReadableDatabase(); 或者 getWritableDatabase(); * 是先建立好 person_info.db,而後在執行此onCreate方法,只執行一次onCreate方法 * 因此(若是建立好 person_info.db後,onCreate方法裏面的創表失敗,那麼一直不會執行onCreate方法了) * 因此(若是建立好 person_info.db後,onCreate方法裏面的創表成功,那麼也一直不會執行onCreate方法了) * 因此onCreate方法的特色是,只在 建立person_info.db後,而後執行一次onCreate方法,後續就不執行onCreate方法了 * * @param db 可執行SQL語句 */ @Override public void onCreate(SQLiteDatabase db) { Log.d("db", "onCreate() >>>>>>>>>>>>>> "); db.execSQL("create table student_table(_id integer primary key autoincrement, name text, age integer);"); } /** * 此方法用於數據庫升級 * @param db 可執行SQL語句 * @param oldVersion 之前舊版本的版本號 * @param newVersion 如今目前最新的版本號 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
@Override public void onClick(View view) { MySQLiteOpenHelper mySQLiteOpenHelper = MySQLiteOpenHelper.getInstance(this); /** * 【第一次調用】 * * 調用getReadableDatabase() 或者 getWritableDatabase(); 的時候,作了兩件事 * * 第一件事: * person_info.db數據庫會被建立:怎麼去建立呢? * 答:根據SQLiteOpenHelper super(context, name, factory, version); 傳遞的數據庫信息,而後內部建立數據庫 * * 第二件事: * student_table表會被建立:怎麼去建立呢? * 答:是先執行好了[第一件事] 而後立刻就執行onCreate建立 student_table表; */ /** * 【第二次調用,或者 第N此調用,反正不是第一次調用了】 * * 調用getReadableDatabase() 或者 getWritableDatabase(); 的時候,作一件事 * * 第一件事: * person_info.db數據庫會被打開? * 答:根據SQLiteOpenHelper super(context, name, factory, version); 傳遞的數據庫信息,而後內部打開數據庫 * * 注意:因爲 數據庫已經存在,是不會執行onCreate方法的 * */ mySQLiteOpenHelper.getWritableDatabase(); }