我的android ç¬?3å¤?-SQLiteOpenHelper对数æ�?º“è¿›è?版本管ç�†
Â
我们在编写数æ�?º“应用è½?»¶æ—¶ï¼Œéœ?è¦�è?ƒè™‘è¿™æ ·çš„é—®é¢˜ï¼šå› ä¸ºæˆ‘ä»¬å¼?å�‘çš„è½?»¶å�?ƒ½ä¼šå®‰è£…在很å?用户的手机上,å?果应用使用到了SQLiteæ•°æ�®åº“,我们必须在用户åˆ�次使用软件时创建出应用使用到的数æ�?º“表结构å�Šæ·»åŠ ä¸?些åˆ�始化记录,å�¦å¤–在è½?»¶å�‡çº§çš„æ—¶å€™ï¼Œä¹Ÿéœ€è¦�å?æ•°æ�®è¡¨ç»“构进行更新ã?‚那么,我们如何æ‰�能实现在用户åˆ�次使用或å�‡çº§è½?»¶æ—¶è‡ªåŠ¨åœ¨ç”¨æˆ·çš„æ‰‹æœºä¸Šåˆ›å»ºå‡ºåº”ç”¨éœ€è¦�的数æ�®åº“表å‘?¼Ÿæ€»ä¸�能è?我们在æ¯�ä¸?œ€è¦�安装æ?è½?»¶çš„æ‰‹æœºä¸Šé€šè¿‡æ‰‹å·¥æ–¹å¼�创建数æ�®åº“表å�§ï¼Ÿå› 为这ç?éœ?求是æ¯�个数æ�®åº“应用都è¦�é�¢ä¸´çš„,所以在Android系统,为我们æ��供了一ä¸?��为SQLiteOpenHelper的抽象类,必须继承它æ‰�能使用,它æ˜??šè¿‡å¯¹æ•°æ�?º“版本进è?管ç�†æ�¥å®žçްå‰�é�¢æ��出的éœ?求ã??/span>
为了实现对数æ�?º“版本进è?管ç�†ï¼ŒSQLiteOpenHelperç±»æ��供了两个é‡�è?的方法,分别是onCreate(SQLiteDatabase db)å’ŒonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),å‰�者用于åˆ�次使用软件时生æˆ�æ•°æ�®åº“表,å�Žè€…用于å�‡çº§è½¯ä»¶æ—¶æ›´æ–°æ•°æ�®åº“表结构。当调用SQLiteOpenHelperçš„getWritableDatabase()或è?…getReadableDatabase()方法获å�–用于æ“�作数æ�®åº“çš„SQLiteDatabase实例的时候,如果数æ�®åº“ä¸�å˜åœ¨ï¼ŒAndroid系统会自动生æˆ�一ä¸?•°æ�?º“,接ç�?调用onCreate()方法,onCreate()方法在åˆ�次生æˆ�æ•°æ�?º“æ—¶æ‰�会è?调用,在onCreate()方法é‡?span style="color: red;" class="Apple-style-span">å�?»¥ç”Ÿæˆ�æ•°æ�®åº“表结构å�Šæ·»åŠ ä¸€äº›åº”ç”¨ä½¿ç”¨åˆ°çš„åˆ�始化数æ�®ã€‚onUpgrade()方法在数æ�?º“的版æœ?�‘生å�˜åŒ–时会è?调用,一èˆ?œ¨è½?»¶å�‡çº§æ—¶æ‰�éœ?改å�˜ç‰ˆæœ¬å�?/span>,è?Œæ•°æ�?º“的版æœ?˜¯ç”±ç¨‹åº�员控制的,å�‡è?æ•°æ�®åº“现在的版本æ˜?,由于业务的å�˜æ›´ï¼Œä¿®æ”¹äº†æ•°æ�®åº“表结构,这时å?™å°±éœ?è¦�å�‡çº§è½¯ä»¶ï¼Œå�‡çº§è½?»¶æ—¶å¸Œæœ›æ›´æ–°ç”¨æˆ·æ‰‹æœºé‡Œçš„æ•°æ�?º“表结构,为了实现这一ç›?š„,å�¯ä»¥æŠŠåŽŸæ�¥çš„æ•°æ�?º“版本设置ä¸?(有å�Œå¦é—®è®¾ç½®ä¸?行ä¸�行?当然å�?»¥ï¼Œå?æžœä½ æ„¿æ„�,è?ç½?¸º100也è?),并且在onUpgrade()方法里é�¢å®žçŽ°è¡¨ç»“æž„çš„æ›´æ–°ã€‚å½“è½?»¶çš„版æœ?�‡çº§æ?数比较å?,这时在onUpgrade()方法里é�¢å�?»¥æ ¹æ�®åŽŸç‰ˆå�·å’Œç›? ‡ç‰ˆæœ¬å�·è¿›è¡Œåˆ¤æ–?¼Œç„¶å�Žä½œå‡ºç›¸åº”的表结构å�Šæ•°æ�?›´æ–°ã??/span>
getWritableDatabase()å’ŒgetReadableDatabase()方法都å�¯ä»¥èŽ·å�–一ä¸?”¨äºŽæ“�作数æ�?º“çš„SQLiteDatabase实例。但getWritableDatabase()方法以è?写方å¼�打å¼?æ•°æ�®åº“,ä¸?旦数æ�?º“çš„ç?盘空间满了,数æ�®åº“å°±å�?ƒ½è¯»è?Œä¸�能写,å?˜è‹¥ä½¿ç”¨çš„æ˜¯getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方å¼�打开数æ�®åº“,如果数æ�®åº“çš„ç£�盘空间满了,就会打å¼?失败,当打开失败å�Žä¼šç»§ç»å°�试以å�ªè¯»æ–¹å¼�打å¼?æ•°æ�®åº“ã??/span>
Â
public class DatabaseHelper extends SQLiteOpenHelper {
   //类没有实例化,æ˜?¸�èƒ½ç”¨ä½œçˆ¶ç±»æž„é€ å™¨çš„å�‚æ•?/span>,必须声明为é�™æ€?/span>
         private static final String name = "itcast";//数�库��/span>
         private static final int version = 1; //数�库版�/span>
        publicDatabaseHelper(Context context) {
//ç¬?¸‰ä¸?�‚æ•?/span>CursorFactory指定在执行查询时获得ä¸?ä¸?¸¸æ ‡å®žä¾‹çš„工厂ç±?/span>,设置ä¸?/span>null,代表使用系统默è?的工厂类
                super(context, name, null, version);
        }
       @Override public void onCreate(SQLiteDatabase db) {
              db.execSQL("CREATETABLE IF NOT EXISTS person (personidinteger primary key autoincrement,name varchar(20),age INTEGER)"); Â
        }
       @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
               db.execSQL("DROPTABLE IF EXISTS person");
               onCreate(db);
        }
}
上é�¢onUpgrade()方法在数æ�?º“版本æ¯�æ?å�‘生å�˜åŒ–时都会把用户手机上的数æ�®åº“è¡¨åˆ é™¤ï¼Œç„¶å�Žå†�é‡�新创建。一èˆ?œ¨å®žé™…项目ä¸?˜¯ä¸�èƒ½è¿™æ ·å�šçš„,æ?ç¡?š„å�𿳕æ˜?œ¨æ›´æ–°æ•°æ�®åº“表结构时,还è?è€ƒè™‘ç”¨æˆ·å˜æ”¾äºŽæ•°æ�?º“ä¸?š„æ•°æ�®ä¸�会丢失ã€?/span>
Â
下载视é?代ç �
Â