Android SQLite數據庫升級,怎麼作(事物更改)

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(32PRIMARY KEY ,UserName VARCHAR(32NOT NULL ,UserAddress VARCHAR(16NOT 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 }
相關文章
相關標籤/搜索