如果我們的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"];//刪除舊表 } }
視圖:

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