1. 程式人生 > >Android傳統資料庫升級 資料遷移 複製舊錶資料到新表

Android傳統資料庫升級 資料遷移 複製舊錶資料到新表

原因:應用升級,舊使用者安裝新版APK時需要更新本地資料庫,複製舊資料庫的資料到新的資料庫,資料庫添加了新的表或者新的欄位

由於專案沒有使用第三方資料庫框架,所以使用了原生的方法(超級累,建議還是使用第三方框架,例如郭霖的LitePal ,或者greendao)

在你的初始化database的方法中新建表,SQL語句:

database.execSQL(
        "create table if not exists tbl_Appliance(ID INT NULL,RoomID INT NULL,DeviceID INT NULL,SubnetID INT NULL,ApplianceImageName varchar(50),Brightness INT NULL,ApplianceID INT NULL,Channel INT NULL,ApplianceRemark varchar(50),OriginalType INT NULL)");

 執行SQL命令,如果不存在則建立表tbl_Appliance,ID是欄位, INT 是型別, NULL表示值允許為空(這個可以不寫)。

如果新表增加了新的列,需要更新表,並把舊錶的資料複製到新表裡面可以使用以下語句:

 //2018.11.15 tbl_Mood
    private static final String CREATE_tbl_Mood_temp = "alter table tbl_Mood rename to tbl_Mood_temp";
    private static final String CREATE_tbl_Mood = "create table tbl_Mood(ID INT  ,RoomID INT ,MoodID INT ,MoodName varchar(50),LightBool INT ,MoodIconName varchar(50),Ac1Bool INT ,Ac2Bool INT ,FloorBool INT ,DiyBool INT ,AudioBool INT ,CurtainBool INT);";
    private static final String INSERT_DATA_MOOD = "insert into tbl_Mood(ID   ,RoomID  ,MoodID  ,MoodName ,LightBool  ,MoodIconName ,Ac1Bool  ,Ac2Bool  ,FloorBool  ,DiyBool  ,AudioBool ) select ID  ,RoomID  ,MoodID  ,MoodName ,LightBool  ,MoodIconName ,Ac1Bool  ,Ac2Bool  ,FloorBool  ,DiyBool  ,AudioBool from tbl_Mood_temp";
    private static final String DROP_TBL_MOOD = "drop table tbl_Mood_temp";
//2018.11.15 tbl_Mood 更新
                    database.execSQL(CREATE_tbl_Mood_temp); //第一步將舊錶改為臨時表

                    database.execSQL(CREATE_tbl_Mood); //第二步建立新表(新新增的欄位或去掉 的欄位)

                    database.execSQL(INSERT_DATA_MOOD); //第三步將舊錶中的原始資料儲存到新表中以防遺失

                    database.execSQL(DROP_TBL_MOOD); //第四步刪除臨時備份表

 第一步是將舊錶改名為臨時表;

第二步是建立新表,新表名改成舊錶的名稱,用來替代舊錶,新表新增的欄位寫在()裡面,例如新表裡面有10個欄位,那麼()裡就把10個欄位都寫進去;

第三步將舊錶的資料複製到新表裡面,由於舊錶只有9個欄位,所以複製資料時新表裡面的引數就寫9個,與舊錶的欄位一一對應,如果把新表的欄位全部寫進複製佇列裡面會丟擲資料庫異常,“新表有10個columns(列),但只提供了9個value(值)”;

複製資料例子:

INSERT INTO new(name, country)
SELECT name, country FROM old;

異常例子(這個是另外一個表異常截圖,表裡有17個欄位,複製舊錶資料時把新增的欄位也寫進了複製佇列):

第四步是刪除舊錶。

如果舊錶和新表的列一樣,沒有增加或減少欄位,那麼可以使用以下SQL語句來複制舊錶資料到新表:

insert into 新表名稱 select *,'' from 舊錶名稱

這個語句可以省掉新增欄位的步驟,可以少寫很多欄位。  ," 不能省略,表示複製所有的欄位。

最後說一句,別用原生方法了,寫死人的!!!