SQLiteOpenHelper
1 // 若是數據庫文件不存在,只有onCreate()被調用(該方法在建立數據庫時被調用一次) 2 public abstract void onCreate(SQLiteDatabase db); 3 // 若是數據庫文件存在,會調用onUpgrade()方法升級數據庫,並更新版本號。 4 public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);
OnCreate : 若是數據庫文件不存在,SQLiteOpenHelper在建立數據庫文件,打開數據庫這個數據庫後,調用onCreate()方法,在該方法中通常須要建立表、視圖等組件。在建立前數據庫通常是空的,所以不須要先刪除數據庫中相關的組件。sql
OnUpgrade : 當系統在構造SQLiteOpenHelper類的對象時,若是發現版本號不同,就會自動調用onUpgrade函數,讓你在這裏對數據庫進行升級。數據庫
新版本號和老版本號都會做爲onUpgrade函數的參數傳進來,便於開發者知道數據庫應該從哪一個版本升級到哪一個版本。app
升級完成後,數據庫會自動存儲最新的版本號爲當前數據庫版本號。ide
須要對SQLite數據庫的結構進行升級: 函數
SQLite提供了ALTER TABLE命令,容許用戶重命名或添加新的字段到已有表中,可是不能從表中刪除字段。
而且只能在表的末尾添加字段,好比,爲 Student添加兩個字段:
1 ALTER TABLE Student ADD COLUMN UserPhone VARCHAR;
2 ALTER TABLE Student ADD COLUMN UserNickName VARCHAR;spa
若是遇到複雜的修改操做,好比在修改的同時,須要進行數據的轉移,那麼能夠採起在一個事務中執行以下語句來實現修改表的需求。
1. 將表名改成臨時表
ALTER TABLE Student RENAME TO __temp__Student;
2. 建立新表
CREATE TABLE Student (UserId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,UserAddress VARCHAR(16) NOT NULL);
3. 導入數據
INSERT INTO Student SELECT UserId, 「」, UserAddress FROM __temp__Student;
或者
INSERT INTO Student() SELECT UserId, 「」, UserAddress FROM __temp__Student;
* 注意 雙引號」」 是用來補充原來不存在的數據的
4. 刪除臨時表
DROP TABLE __temp__Student;
經過以上四個步驟,就能夠完成舊數據庫結構向新數據庫結構的遷移,而且其中還能夠保證數據不會應爲升級而流失。
固然,若是遇到減小字段的狀況,也能夠經過建立臨時表的方式來實現。code
獲取表中字段:sqlite
1 // 獲取升級前表中的字段 2 protected String getColumnNames(SQLiteDatabase db, String tableName) 3 { 4 StringBuffer columnNameBuffer = null; 5 Cursor c = null; 6 try 7 { 8 c = db.rawQuery( "PRAGMA table_info(" + tableName + ")", null); 9 if (null != c) { 11 int columnIndex = c.getColumnIndex("name"); 12 if (-1 == columnIndex) { 14 return null; 15 } 16 17 int index = 0; 18 columnNameBuffer = new StringBuffer(c.getCount()); 19 for ( c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 21 columnNameBuffer.append(c.getString( columnIndex )); 22 columnNameBuffer.append(","); 23 index++; 24 } 25 } 26 } 27 catch (Exception e) { 29 e.printStackTrace(); 30 } 31 finally { 33 if (c != null) { 35 c.close(); 36 } 37 } 38 return columnNameBuffer.toString();40 }
加上事物控制:對象
1 // update table 2 private void updateTable(SQLiteDatabase db, String tableName, String columns) 3 { 4 try 5 { 6 db.beginTransaction(); 7 String oldColumns = columns.substring(0, columns.length() - 1); 8 // rename the table 9 String tempTable = tableName + "texp_temptable"; 10 String renameTableSql = "alter table " + tableName + " rename to " + tempTable; 11 db.execSQL(renameTableSql); 12 14 // drop the oldtable 15 String dropTableSql = "drop table if exists " + tableName; 16 db.execSQL(dropTableSql); 17 // creat table 18 String createTableSql = "create table if not exists " + tableName + "(name text, pwd text, tel text)"; 19 db.execSQL(createTableSql); 20 // load data 21 String newColume = "tel"; 22 String newColumns = oldColumns + "," + newColumn; 23 String insertSql = "insert into " + tableName + " (" + newColumns + ") " + "select " + oldColumns + "" + " " + " from " + tempTable; 25 db.execSql(insertSql); 26 db.setTransactionSuccessful(); 27 } 28 catch (Exception e) 29 { 30 // TODO: handle exception 31 Log.i( "tag", e.getMessage() ); 32 } 33 finally 34 { 35 db.endTransaction(); 36 } 39 }
//DBHelper: blog
1 public class DBHelper extends SQLiteOpenHelper { 2 3 private static final String DATABASE_NAME = "student.db"; 4 private static final int DATABASE_VERSION = 1002; 5 6 private static DBHelper instance = null; 7 8 9 public DBHelper(Context context) { 10 super(context, DATABASE_NAME, null, DATABASE_VERSION); 11 } 12 13 public synchronized static DBHelper getInstance(Context context) { 14 if (instance == null) { 15 instance = new DBHelper(context); 16 } 17 return instance; 18 } 19 20 @Override 21 public void onCreate(SQLiteDatabase db) { 22 db.execSQL(SQL.CREATE_TABLE_FAVORITE); 23 24 // 若不是第一個版本安裝,直接執行數據庫升級 25 // 請不要修改FIRST_DATABASE_VERSION的值,其爲第一個數據庫版本大小 26 final int FIRST_DATABASE_VERSION = 1000; 27 onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION); 28 } 29 30 @Override 31 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 32 // 使用for實現跨版本升級數據庫 33 for (int i = oldVersion; i < newVersion; i++) { 34 switch (i) { 35 case 1000: 36 upgradeToVersion1001(db); 37 break; 38 case 1001: 39 upgradeToVersion1002(db); 40 break; 41 42 default: 43 break; 44 } 45 } 46 } 47 48 private void upgradeToVersion1001(SQLiteDatabase db){ 49 // student 表新增1個字段 50 String sql1 = "ALTER TABLE Student ADD COLUMN age VARCHAR"; 51 db.execSQL(sql1); 52 }
53 private void upgradeToVersion1002(SQLiteDatabase db){ 54 // student 表新增2個字段, 添加新字段只能一個字段一個字段加,sqlite有限制不予許一條語句加多個字段 55 String sql1 = "ALTER TABLE Student ADD COLUMN tel VARCHAR"; 56 String sql2 = "ALTER TABLE Student ADD COLUMN address VARCHAR"; 57 db.execSQL(sql1); 58 db.execSQL(sql2); 59 } 60 }