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 舊錶名稱

這個語句可以省掉添加字段的步驟,可以少寫很多字段。  ," 不能省略,表示複製所有的字段。

 

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

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