天天看點

sqlite 更新

在項目不斷推進的情況下,資料庫表結構不滿足需求是很常見的事情,這個時候,我們需要對資料庫進行更新。

首先,不談更新的具體實作,談一下如何盡量避免更新,因為更新是一個痛苦的過程。在第一個釋出版本中,資料庫表結構要盡量穩定,也就是要多考慮,不要因為一點點需求變動,馬上就要修改表結構,這樣非常痛苦。我們也可以在可能變動的表中增加備用字段,這樣,在需要新字段的時候,啟用備用字段,而不用修改表結構。

如果真的遇到了需要資料庫更新的情況,那麼,我們一定要保證資料不丢失。在sqlite平台,有兩種方式可以完成表結構的更新:一個是使用alter指令。這個有一個缺陷,隻能增加字段,不能删除字段。第二種方式是建立臨時表,然後把臨時表的資料遷移到新表。

資料庫更新最大的悲哀就是要針對所有的老版本做維護……

别人的一篇文章:

做Android應用,不可避免的會與SQLite打交道。随着應用的不斷更新,原有的資料庫結構可能已經不再适應新的功能,這時候,就需要對SQLite資料庫的結構進行更新了。

  SQLite提供了ALTER TABLE指令,允許使用者重命名或添加新的字段到已有表中,但是不能從表中删除字段。

  并且隻能在表的末尾添加字段,比如,為 Subscription添加兩個字段:    

1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;
2 ALTER TABLE Subscription ADD COLUMN Key BLOB;      

  另外,如果遇到複雜的修改操作,比如在修改的同時,需要進行資料的轉移,那麼可以采取在一個事務中執行如下語句來實作修改表的需求。

  1. 将表名改為臨時表

ALTER TABLE Subscription RENAME TO __temp__Subscription;      

  2. 建立新表

CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);      

  3. 導入資料  

INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;      

  或者  

INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__Subscription;      

  * 注意 雙引号”” 是用來補充原來不存在的資料的

  4. 删除臨時表  

DROP TABLE __temp__Subscription;      

  通過以上四個步驟,就可以完成舊資料庫結構向新資料庫結構的遷移,并且其中還可以保證資料不會應為更新而流失。

  當然,如果遇到減少字段的情況,也可以通過建立臨時表的方式來實作。