在前面使用SQLite3的時候,並沒有留意到有SQLiteOpenHelper這個類,所以只好在Activity裡面去創建和維護資料庫跟資料表的創建。



但是,現在有了SQLiteOpenHelper這個類,就可以把資料庫和資料表,以及一些初始化的資料的維護跟Activity分開了。。。





資料庫和資料表結構的創建,是只需要執行一次的,而打開資料庫獲取資料庫相應的SQLiteDatabase操作類則有可能是每次運行程式都需要執行的,如何把這兩個步驟操作合理的放到一個輔助類裡面呢?SQLiteOpenHelper!木錯!就是這個類,只需要繼承這個類,調用建構函式SQLiteOpenHelper(CoNtext coNtext, String name, CursorFactory factory,int version)然後重寫onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)這兩個方法即可(不過好像我只是使用了onCreate...)。

 

下面說一下這個類的大概原理,假設你的SQLiteHelper繼承于SQLiteOpenHelper類,調用SQLiteOpenHelper的建構函式並且實現了onCreate和斷onUpgrade,當你在程式中調用getWritableDatabase()方法的時候,會自動去檢查你的databases目錄,如果裡面不存在你需要打開的資料庫檔案,則會自動調用你所寫的方法onCreate,然後返回你所創建的資料庫表像,如果已經存在則會直接返回該資料庫的表像。這樣,我們初始化的資料庫表,跟預設資料就可以放到onCreate函數裡面去實現。。。





繼承的類建構函式裡面必須調用父類(SQLiteOpenHelper)的建構函式SQLiteOpenHelper(CoNtext coNtext, String name, CursorFactory factory,int version)。

 

coNtext是為打開創建資料庫庫用的,name是資料庫的檔案名稱,factory設置為空使用預設的,version是創建或打開的資料庫的版本號,這個必須大於等於1

 

如果這一次的version版本和上一次打開的version不一致的時候,SQLiteOpenHelper就會自動調用onUpgrade方法。。

 

對了,在Activity中,如果打開了資料庫,一定要記得關閉!!!





測試SQLiteOpenHelper的一個代碼框架,

 

SQLiteHelper.java



[java] view plaincopyprint?
01.package com.Yao_GUET.test;
02.
03.import android.content.CoNtext;
04.import android.database.SQLException;
05.import android.database.sqlite.SQLiteDatabase;
06.import android.database.sqlite.SQLiteDatabase.CursorFactory;
07.import android.database.sqlite.SQLiteOpenHelper;
08.import android.util.Log;
09.
10./**
11. * SQLite3資料庫輔助類
12. * @author Yao.GUET
13. * blog: HTTP://blog.csdn.net/Yao_GUET
14. * date: 2011-07-06
15. */
16.
17.public class SQLiteHelper extends SQLiteOpenHelper {
18. private final static String TAG = "SQLiteHelper";
19.
20. public SQLiteHelper(CoNtext coNtext, String name, CursorFactory factory,
21. int version) {
22. super(coNtext, name, factory, version);
23. // TODO Auto-generated constructor stub
24. }
25.
26. @Override
27. public void onCreate(SQLiteDatabase db) {
28. // TODO Auto-generated method stub
29. Log.e(TAG, "SQLitehelper onCreate!");
30. try {
31. db.execSQL("Create TABLE Data( " +
32. "ID integer Primary Key AUTOINCREMENT, " +
33. "UserName Varchar(50) " +
34. ")");
35. Log.e(TAG, "createDataTable OK!");
36. } catch (SQLException se) {
37. se.printStackTrace();
38. }
39. }
40.
41. @Override
42. public void onOpen(SQLiteDatabase db) {
43. // TODO Auto-generated method stub
44. Log.e(TAG, "SQLiteHelper on Open!");
45. super.onOpen(db);
46. }
47.
48. @Override
49. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
50. // TODO Auto-generated method stub
51. Log.e(TAG, "SQLitehelper onUpgrade!");
52. }
53.
54.}
package com.Yao_GUET.test;

 

import android.content.CoNtext;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

 

/**
* SQLite3資料庫輔助類

 

* @author Yao.GUET
 * blog: http://blog.csdn.net/Yao_GUET
 * date: 2011-07-06
 */

public class SQLiteHelper extends SQLiteOpenHelper {
 private final static String TAG = "SQLiteHelper";
 
 public SQLiteHelper(Context context, String name, CursorFactory factory,
   int version) {
  super(context, name, factory, version);
  // TODO Auto-generated constructor stub
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  // TODO Auto-generated method stub
  Log.e(TAG, "SQLitehelper onCreate!");
  try {
   db.execSQL("Create TABLE  Data( " +
     "ID integer Primary Key AUTOINCREMENT, " +
     "UserName varchar(50) " +
     ")");
   Log.e(TAG, "createDataTable OK!");
  } catch (SQLException se) {
   se.printStackTrace();
  }
 }

 @Override
 public void onOpen(SQLiteDatabase db) {
  // TODO Auto-generated method stub
  Log.e(TAG, "SQLiteHelper on Open!");
  super.onOpen(db);
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // TODO Auto-generated method stub
  Log.e(TAG, "SQLitehelper onUpgrade!");
 }

}

测试Activity

SQLiteHelperTest.java


[java] view plaincopyprint?
01.package com.Yao_GUET.test; 
02. 
03.import android.app.Activity; 
04.import android.database.sqlite.SQLiteDatabase; 
05.import android.os.Bundle; 
06.import android.util.Log; 
07.import android.view.KeyEvent; 
08.import android.widget.Button; 
09.import android.widget.TextView; 
10. 
11.public class SQLiteHelperTest extends Activity { 
12.    private final static String TAG = "SQLiteHelperTest"; 
13.     
14.    private SQLiteHelper sqlHelper; 
15.    private SQLiteDatabase db; 
16.     
17.    @Override 
18.    protected void onCreate(Bundle savedInstanceState) { 
19.        // TODO Auto-generated method stub  
20.        super.onCreate(savedInstanceState); 
21.        setContentView(R.layout.sqlitehelper_test); 
22.         
23.        sqlHelper = new SQLiteHelper(this, "test2.db", null, 2); 
24.        db = sqlHelper.getWritableDatabase(); 
25.    } 
26. 
27.    @Override 
28.    protected void onDestroy() { 
29.        // TODO Auto-generated method stub  
30.        Log.e(TAG, "onDestroy!"); 
31.        if (db != null) 
32.            db.close(); 
33.        super.onDestroy(); 
34.    } 
35. 
36.    @Override 
37.    protected void onPause() { 
38.        // TODO Auto-generated method stub  
39.        Log.e(TAG, "onPause"); 
40.        super.onPause(); 
41.    } 
42.} 

 

FROM:http://blog.csdn.net/yao_guet/article/details/6587399

創作者介紹

資訊園

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()