天天看點

SQLite資料庫建立、更新入門

簡述:    

     SQLiteOpenHelper 是一個抽象類,就是說如果我們想要使用它的話,就需要建立一個自己的幫助類去繼承它。

SQLiteOpenHelper 中有兩個抽象方法,分别是

onCreate()和 onUpgrade(),

我們必須在自己的幫助類裡面重寫這兩個方法,然後分别在這兩個方法中去實作建立、更新資料庫的邏輯。

SQLiteOpenHelper 中還有兩個非常重要的執行個體方法 , 

getReadableDatabase() 和getWritableDatabase()。

這兩個方法都可以建立或打開一個現有的資料庫(如果資料庫已存在則直接打開,否則建立一個新的資料庫) ,

并傳回一個可對資料庫進行讀寫操作的對象。

不同的是,當資料庫不可寫入的時候(如磁盤空間已滿)getReadableDatabase()方法傳回的對象将以隻讀的方式去打開資料庫,而 getWritableDatabase()方法則将出現異常。

使用SQLite資料庫步驟:

一、建立自己的類,繼承SQLiteOpenHelper,重寫構造方法,onCreate()和 onUpgrade()。

SQLiteOpenHelper 中有兩個構造方法可供重寫, 一般使用參數少一點的那個構造方法即可。

public MyDatabaseHelper(Context context, String name, CursorFactoryfactory, int version) {

super(context, name, factory, version);

mContext = context;

}

這個構造方法中接收四個參數,

1)、第一個參數是上下文 Context,有它才能對資料庫進行操作。

2)、第二個參數是資料庫名,建立資料庫時的名稱。

3)、第三個參數查詢資料的時候傳回一個自定義的 Cursor,一般都是傳入 null。

4)、第四個參數表示目前資料庫的版本号,可用于對資料庫進行更新操作。

二、執行個體化繼承了SQLiteOpenHelper抽象類的類,調用它的 getReadableDatabase()或 getWritableDatabase()方法

建構出SQLiteOpenHelper 的執行個體之後,再調用它的 getReadableDatabase()或 getWritableDatabase()方法就能夠建立資料庫了,

【資料庫檔案會存放在/data/data/<package name>/databases/目錄下】

此時,重寫SQLiteOpenHelper抽象類的onCreate()方法會得到執行,是以通常會在這裡去處理一些建立表的邏輯。

代碼:

MySQLiteOpenHelper.java中的代碼:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

	/**
	 * 建立資料庫表book語句 解析: 1)integer 表示整型, 2)real 表示浮點型, 3)text 表示文本類型, 4)blob
	 * 表示二進制類型。 5)primary key 将 id 列設為主鍵,并用 autoincrement關鍵字表示 id 列是自增長的。
	 */
	public static final String CREATE_BOOK = "create table book ("
			+ "id integer primary key autoincrement, " + "author text, "
			+ "price real, " + "pages integer, " + "name text)";

	/**
	 * 建立資料庫表Category 語句
	 */
	public static final String CREATE_CATEGORY = "create table Category ("
			+ "id integer primary key autoincrement, " + "category_name text, "
			+ "category_code integer)";

	/**
	 * 上下文對象
	 */
	private Context context;

	/**
	 * 重寫SQLiteOpenHelper的構造方法,這個構造方法中接收四個參數:
	 * 
	 * @param context
	 *            (上下文 Context,有它才能對資料庫進行操作)
	 * @param name
	 *            (是資料庫名,建立資料庫時的名稱)
	 * @param factory
	 *            (查詢資料的時候傳回一個自定義的 Cursor,一般都是傳入 null)
	 * @param version
	 *            (目前資料庫的版本号,可用于對資料庫進行更新操作)
	 */
	public MySQLiteOpenHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		this.context = context;
	}

	/**
	 * 執行個體化SQLiteOpenHelper類之後 ,調用getReadableDatabase()或 getWritableDatabase()方法。
	 * 如果是要建立的資料庫不存在,就執行oncreate()方法,建立資料庫; 如果已經存在要建立的資料庫,則不執行oncreate()方法
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);// 執行sql語句
		Toast.makeText(context, "資料庫建立成功", 1).show();
	}

	/**
	 * 對資料庫進行更新,注意: switch 中每一個 case的最後都是沒有使用 break ,
	 * 這是為了保證在跨版本更新的時候,每一次的資料庫修改都能被全部執行到
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		switch (oldVersion) {
		case 1:
			db.execSQL(CREATE_CATEGORY);
			Toast.makeText(context, "更新資料庫,舊版本是" + oldVersion, 1).show();
		case 2:
			Toast.makeText(context, "更新資料庫,舊版本是" + oldVersion, 1).show();
		default:
		}
	}

}
           

MainActivity.java中的代碼:

public class MainActivity extends Activity {

	private MySQLiteOpenHelper helper;
	private Button create_sqliteDataBase;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * 執行個體化MySQLiteOpenHelper,指定資料庫名:Book.db,和版本号 1
		 * 如果此次執行的版本号,比上次的版本号大(如,上次是1.這次是2),則執行MySQLiteOpenHelper類中的重寫的onUpgrade()方法
		 */
		helper = new MySQLiteOpenHelper(this, "Book.db", null, 1);
		create_sqliteDataBase = (Button) findViewById(R.id.create_sqliteDataBase);
		create_sqliteDataBase.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				/**
				 * 當第一次點選 按鈕時,會檢測 到目前程式中并沒有 Book.db這個資料庫,
				 * 于是會建立該資料庫并調用 MySQLiteOpenHelper中的 onCreate()方法,這樣 Book表也就得到了建立。
				 *  再次點選 按鈕時,會發現此時已經存在 BookStore.db 資料庫了,是以不會重複建立一次。
				 */
				helper.getWritableDatabase();
			}
		});
	}

}
           

下載下傳連結:

SQLite資料庫建立、更新入門下載下傳位址

繼續閱讀