Android傳統資料庫升級 資料遷移 複製舊錶資料到新表
阿新 • • 發佈:2019-02-06
原因:應用升級,舊使用者安裝新版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 舊錶名稱
這個語句可以省掉新增欄位的步驟,可以少寫很多欄位。 ," 不能省略,表示複製所有的欄位。
最後說一句,別用原生方法了,寫死人的!!!