• 快速的解决升级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"];//删除旧表
        }
    }
    视图:

    恩,到这里完成更新操作了!!!!
  • 相关阅读:
    Codeforces Round #779 VP 记录
    AtCoder Beginner Contest 246 赛时记录
    Codeforces 1800+ 乱做
    [题解] 20212022 ICPC, NERC, Northern Eurasia Onsite F Fancy Stack
    .net跨平台运行实践
    正则表达式常用元字符data.str.extract(r"正则表达式")
    SQL TJM公司3月31日的面试题
    第三阶段day01_html dust
    第三阶段day02 & 03_css dust
    Mac Mysql Table 'xxx.xxxx' doesn't exist" 重启笔记本,mysql表无法访问
  • 原文地址:https://www.cnblogs.com/yulongjiayuan/p/5364272.html
Copyright © 2020-2023  润新知