2013年9月1日 星期日

Android Sqlite 版本更新、資料結構更改

Android Sqlite 版本更新

/////////////////////////////////////////////////
//第一個版本
/////////////////////////////////////////////////
private final static String DB_NAME = "kagoo.db3"; // 資料庫名稱;
private final static int VERSION = 1; // 資料庫版本
// 品號資料表
public final static String TABLENAME = "stock"; // 資料表名稱
public final static String PRODUCTNO = "productno"; // 品號
public final static String NAME = "name"; // 品名
public final static String COUNT = "count"; // 數量
public final static String COST = "cost"; // 單位成本
public final static String SPACE = "space"; // 儲位
//建構式
public StockDBHelper(Context context) {
     super(context, DB_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // 建立庫存資料表
    String createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(13) not null primary key," + // 品號-主鍵
    "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
    "%s INTEGER not null," + // 數量
    "%s INTEGER not null," + // 成本
    "%s VARCHAR(10) null)" // 儲位
     , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
--------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////
//第二個版本,增加一個資料表
/////////////////////////////////////////////////
private final static String DB_NAME = "kagoo.db3"; // 資料庫名稱;
private final static int VERSION = 2; // 資料庫版本,版本更新為2
// 品號資料表
public final static String TABLENAME = "stock"; // 資料表名稱
public final static String PRODUCTNO = "productno"; // 品號
public final static String NAME = "name"; // 品名
public final static String COUNT = "count"; // 數量
public final static String COST = "cost"; // 單位成本
public final static String SPACE = "space"; // 儲位
// 儲位資料表(新增的資料表)
public final static String SPACENAME = "spacename"; // 儲位資料表名稱
public final static String SPACEMENU = "spacemenu"; // 儲位名稱

//建構式
public StockDBHelper(Context context) {
     super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
    // 建立庫存資料表
    String createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(13) not null primary key," + // 品號-主鍵
    "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
    "%s INTEGER not null," + // 數量
    "%s INTEGER not null," + // 成本
    "%s VARCHAR(10) null)" // 儲位
     , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
    db.execSQL(createTable);
    // 建立儲位資料表
    createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
     , SPACENAME, SPACEMENU);
     db.execSQL(createTable);

}
//如果是新安裝的用戶,會執行上面的onCreate()
//如果先前是已經安裝的用戶,會執行下面的 onUpgrade()
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion == 1) {
          // 建立儲位資料表
          createTable = String.format("Create Table %s(" + // 資料表名稱
          "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
          , SPACENAME, SPACEMENU);
          db.execSQL(createTable);

          db.setVersion(newVersion);// 重新設定資料庫版本
    }
}
--------------------------------------------------------------------------------------------------
/////////////////////////////////////////////////
//第三個版本,修改庫存資料表結構
/////////////////////////////////////////////////
private final static String DB_NAME = "kagoo.db3"; // 資料庫名稱;
private final static int VERSION = 3; // 資料庫版本,版本更新為3
// 品號資料表
public final static String TABLENAME = "stock"; // 資料表名稱
public final static String PRODUCTNO = "productno"; // 品號
public final static String NAME = "name"; // 品名
public final static String COUNT = "count"; // 數量
public final static String COST = "cost"; // 單位成本
public final static String SPACE = "space"; // 儲位
// 儲位資料表(新增的資料表)
public final static String SPACENAME = "spacename"; // 儲位資料表名稱
public final static String SPACEMENU = "spacemenu"; // 儲位名稱

//建構式
public StockDBHelper(Context context) {
     super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
    // 建立庫存資料表
    String createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(13) not null primary key," + // 品號-主鍵
    "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
    "%s REAL not null," + // 數量,原本為整數,改為浮點數
    "%s REAL not null," + // 成本
    "%s VARCHAR(10) null)" // 儲位
     , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
    db.execSQL(createTable);
    // 建立儲位資料表
    createTable = String.format("Create Table %s(" + // 資料表名稱
    "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
     , SPACENAME, SPACEMENU);
     db.execSQL(createTable);

}
//如果是新安裝的用戶,會執行上面的onCreate()
//如果先前是已經安裝的用戶,會執行下面的 onUpgrade()
//Android Sqlite 無法直接更改資料表結構,請參考下面的方法。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion == 1) { //如果舊用戶的版本為1,直接更新到第3版
          // 建立儲位資料表
          createTable = String.format("Create Table %s(" + // 資料表名稱
          "%s VARCHAR(10) PRIMARY KEY)" // 序號-儲位
          , SPACENAME, SPACEMENU);
          db.execSQL(createTable);

          updateStockTable(db);// 更新庫存資料表結構
          db.setVersion(newVersion);// 重新設定資料庫版本   
    }

    if (oldVersion == 2) { //如果舊用戶的版本為2,更新到第3版
          updateStockTable(db);// 更新庫存資料表結構
          db.setVersion(newVersion);// 重新設定資料庫版本
    }
}

private void updateStockTable(SQLiteDatabase db) {
         // 1.將舊的資料表名稱更名
         String updateTable = String.format("ALTER TABLE %s RENAME TO %s",
         TABLENAME, "temptable");
         db.execSQL(updateTable);


         // 2.創建一個新的資料表為舊表的名稱
         String createTable = String.format("Create Table %s(" + // 資料表名稱
           "%s VARCHAR(13) not null primary key," + // 品號-主鍵
           "%s nvarchar(60) not null," + // 品名 nvarchar n代表多號語言
           "%s REAL not null," + // 數量
           "%s REAL not null," + // 成本
           "%s VARCHAR(10) null)" // 儲位
          , TABLENAME, PRODUCTNO, NAME, COUNT, COST, SPACE);
         db.execSQL(createTable);
      

          // 3.將舊表寫入到新表
         updateTable = String.format("INSERT INTO %s SELECT * FROM %s",
           TABLENAME, "temptable");
         db.execSQL(updateTable);


         // 4.刪除舊表
         updateTable = String.format("DROP TABLE %s", "temptable");
         db.execSQL(updateTable);

}
以上方法僅供參考。

沒有留言 :

張貼留言