快速的解決升級app之后更新數據庫的表結構


如果我們的app新版本要需要對某個表進行添加字段,更新app的時候我們也要對數據庫進行更新,也同樣需要添加新字段. 我的項目里,原來的

session表主鍵是 sessionId  ,但是由於項目需要,我們把主鍵換成了business_id   然后,原來的主鍵就變成普通字段了,更新數據庫的時候,我們要怎么更新主鍵,和添加字段,並且復制原有數據庫的數據呢???(哎,菜鳥一個,忙到凌晨2點多才搞定)

 項目里在哪里創的表,就在哪里進行結構的判斷,以及做出相應的表更新(操作數據庫用的是框架--FMDB)

舊項目我的表是這樣創建的:

- (void)sessionTableCreate {
    [self createTable:@"session" sql:@"CREATE table session (sessionId TEXT NOT NULL PRIMARY KEY UNIQUE ON CONFLICT REPLACE, dateTime INTEGER,type INTEGER,text varchar(2048),unreadCount INTEGER,sumCount INTEGER,state INTEGER)"];
}

視圖:

 

新版本主鍵換成 business_id   添加了新的字段   chat_session_type     visit_studio_id       (然后原來的主鍵就要變成普通的字段了)

@property (nonatomic, strong) FMDatabase *dataBase;

- (void)sessionTableCreate {
    [self createTable:@"session" sql:@"CREATE table session (business_id TEXT NOT NULL PRIMARY KEY UNIQUE ON CONFLICT REPLACE, sessionId TEXT NOT NULL, dateTime INTEGER,type INTEGER,text varchar(2048),unreadCount INTEGER,sumCount INTEGER,state INTEGER, chat_session_type TEXT, visit_studio_id TEXT)"];
    
    if (![self.dataBase columnExists:@"chat_session_type" inTableWithName:@"session"] && ![self.dataBase columnExists:@"visit_studio_id" inTableWithName:@"session"]) {//判斷表是否包含某個字段
        
        [self.dataBase executeUpdate:@"ALTER TABLE session RENAME TO temp_session"];//將原來的表改名
        
        [self createTable:@"session" sql:@"CREATE table session (business_id TEXT NOT NULL PRIMARY KEY UNIQUE ON CONFLICT REPLACE, sessionId TEXT NOT NULL, dateTime INTEGER,type INTEGER,text varchar(2048),unreadCount INTEGER,sumCount INTEGER,state INTEGER, chat_session_type TEXT, visit_studio_id TEXT)"];//創建新表
        
        [self.dataBase executeUpdate:@"insert into session(business_id,sessionId,dateTime,type,text,unreadCount,sumCount,state,chat_session_type,visit_studio_id) select sessionId,sessionId,dateTime,type,text,unreadCount,sumCount,state,'','' from temp_session"];//復制改名后的表到新建的表(注意:一列對應一列的進行復制,新增的字段可以用''來補  因為我主鍵是NOT NULL 不能為空,所以我這里暫時先把原來的sessionId數據也復制到主鍵列)
        [self.dataBase executeUpdate:@"drop table temp_session"];//刪除舊表
    }
}
視圖:

恩,到這里完成更新操作了!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM