Android Sqlite數據庫的升級(二)

Android Sqlite數據庫的升級(二)


Sqlite 僅僅支持 ALTER TABLE 語句的一部分功能,我們可以用 ALTER TABLE 語句來更改一個表的名字,也可向表中增加一個字段(列),但是我們不能刪除一個已經存在的字段,或者更改一個已經存在的字段的名稱、數據類型、限定符等等。

那麼當我們需要修改一個字段A的屬性,比如從int升級到long(其實Integer可以表示這2種類型了,就不存在這個假設了)類型,有如下2種方法。

法1:增加一個新的long字段B來代替原先的字段A,並且新增一個字段C來區分原有的舊數據A和新數據B,用於查詢時區分用A還是用B來表示字段A和B表示的意義。

法2:通過新建一個新表,修改字段屬性,然後將數據copy過來。

(1)改變表名: ALTER TABLE 舊錶名 RENAME TO 新表名 

(2)創建新表:

(3)複製數據:

  • 當只是改變字段屬性時,通過如下方法copy數據
String copyInfo = "insert into " + DB_TABLE + " select * from temp";//表結構一致,只是列的屬性修改,比如int修改到long
  • 當修改刪除了字段後,通過如下方法copy數據
String copyInfo = "insert into " + DB_TABLE + " (" +  COLUMN_NAME + ", " + COLUMN_DES + ") select " + COLUMN_NAME + ", " + COLUMN_DES + " from temp";

(4)刪除臨時表: temp是臨時表名

drop table temp


部分代碼:

//修改字段屬性或者刪除字段
	private void modifyDb(SQLiteDatabase db){
		Log.e("db", "修改數據庫結構");
		db.beginTransaction();
		try {
			//重命名
			final String tempTable = "temp";//臨時表名
			final String renameDB = "alter table " + DB_TABLE + " rename to " + tempTable;//重命名爲tempTable
			db.execSQL(renameDB);
			//創建新表
			onUpgrade(db, 0, DB_VERSION - 1);//執行原先的舊錶的創建包括升級過程(不包括本版本,故減1),創建時使用修改過的sql語句
//			//或者 
//		    for (int version = 1; version < DB_VERSION; version++) {
//				upgradeTo(db, version);
//			}
			
			//插數據入
			String copyInfo = "insert into " + DB_TABLE + " select * from " + tempTable;//表結構一致,只是列的屬性修改,比如int修改到long
			//複製部分字段
			//String copyInfo = "insert into " + DB_TABLE + " (" +  COLUMN_NAME + ", " + COLUMN_DES + ") select " + COLUMN_NAME + ", " + COLUMN_DES + " from " + tempTable;
			//String copyInfo = "insert into " + DB_TABLE + " (" +  COLUMN_NAME  + ") select " + COLUMN_NAME  + " from " + tempTable;
			db.execSQL(copyInfo);
			
			//由於在Sqlite中使用自增長字段,引擎會自動產生一個sqlite_sequence表,用於記錄每個表的自增長字段的已使用的最大值,所以要一起更新下。如果有沒有設置自增長,則跳過此步驟。
			String update_seq = "update sqlite_sequence set seq = 3 where name = " + DB_TABLE;//3是位置值
			//刪除臨時表
			//db.execSQL("drop table " + tempTable);//可以用這個來驗證是否成功修改成功了
			db.setTransactionSuccessful(); //設置成功
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			db.endTransaction(); 
		}
	}



//向表中插入數據

private void insert(){
	    	SQLiteDatabase db = null;
	    	try { 
	    		MyDBHelper dbHelper = new MyDBHelper(getApplicationContext(), DB_NAME, null, DB_VERSION);
	    		db = dbHelper.getReadableDatabase();
	    		for(int i = 0; i < 4; i++){
		    		ContentValues values = new ContentValues();
		    		values.put(MyDBHelper.COLUMN_NAME, "name" + i);
		    		values.put(MyDBHelper.COLUMN_DES, "測試數據");
		    		//long rowid = db.insert(MyDBHelper.DB_TABLE, null, values);//返回行號,失敗返回-1
	    			//法2:此方法的需要爲所有的字段初始化數據
		    		String sql = "insert into " + MyDBHelper.DB_TABLE + " values (null, ?, ?, ?)";//用null,因爲表中第一個參數是INTEGER自增
	    			db.execSQL(sql, new String[]{"name" + i, "測試數據", ""});
	    		}
	    	
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				if(db != null){
					db.close();
				}
			}
	}
	

Android Sqlite數據庫的升級(1)

數據庫升級下載地址






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章