关于数据库的增、删、改、查等基本操作本文不去介绍,网上大把的详细教程,这里只介绍实际使用中的一种情况:数据库中修改字段名称。

在产品更迭的过程中我们有时候需要修改数据库表中已存在的字段名或字段类型,这个时候我们去baidu.com或jianshu.com的话找到的答案应该是以下两种:

  • alter table user CHANGE new1 new4 int;
  • alter table user rename column a to b;

然而这两种方法都并不能在SQLite3中起作用,因为在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作。也就是说,SQLite无法使用rename/change语句修改字段名了。但如果我们产品更迭过程中不巧有这种奇葩需求了,怎么办呢?这时候只能采取迂回政策了:

如何把tableA中的字段oldColumn修改为newColumn

解决方法:

  1. 在tableA中添加字段newColumn
ALTER TABLE tableA ADD COLUMN newColumn INTEGER
复制代码
  1. 将旧字段oldColumn的值赋值给新字段newColumn
UPDATE tableA SET newColumn = oldColumn
复制代码
  1. 删除旧字段oldColumn ALTER TABLE tableA DROP COLUMN oldColumn 然后到第三步你会发现又被SQLite坑了:SQLite无法删除字段!!

第3步解决办法:(依旧是迂回政策)
3.1. 先创建备份表tableA_backup将tableA数据备份

CREATE TEMPORARY TABLE tableA_backup(id INTEGER PRIMARY KEY AUTOINCREMENT, newColumn INTEGER)
复制代码

3.2 将原表tableA中的数据对应的复制到tableA_backup表中

INSERT INTO tableA_backup SELECT id, newColumn FROM tableA
复制代码

不要将旧字段oldColumn复制过去,备份表tableA_backup中没有oldColumn字段
3.3 此时实际已经得到了改过字段名的表:tableA_backup,然后将原表tableA删掉

DROP TABLE tableA
复制代码

3.4 然后创建表tableA

CREATE TABLE tableA(id INTEGER PRIMARY KEY AUTOINCREMENT, newColumn INTEGER)
复制代码

3.5 再把备份表tableA_backup中的数据复制到tableA中

INSERT INTO tableA SELECT id, newColumn FROM tableA_backup
复制代码

3.6 把备份表tableA_backup删除,Have done!

DROP TABLE tableA_backup
复制代码

修改字段名及类型的思路就是上面这些步骤,下面给贴上代码方便大家阅读使用:

# 方法调用:[self alterTable:@"currentList"renameOldColumn:@"isvipa"toNewColumn:@"vipType"andNewColumnType:@"INTEGER"withDatabase:dballRenamedColumnsAndTypes:@"id INTEGER PRIMARY KEY AUTOINCREMENT, isinsider INTEGER, vipType INTEGER, groupcode TEXT, groupname TEXT, grouppicpath TEXT, uuid TEXT, AESkey TEXT"allRenamedColumnNames:@"id, isinsider, vipType, groupcode, groupname, grouppicpath, uuid, AESkey"];复制代码
/**修改表中一个字段名 (sqlite3无法使用rename/change语句直接修改字段名)@param tableName 表名@param oldColumnName 要被修改的字段名@param newColumnName 字段被修改后的名称@param newColumnType 字段被修改后的类型@param db 数据库对象@param renamedColumnsAndTypes 修改后所有的字段及对应的类型  eg: id INTEGER PRIMARY KEY AUTOINCREMENT, isinsider INTEGER, vipType INTEGER, groupcode TEXT, groupname TEXT, grouppicpath TEXT, uuid TEXT, AESkey TEXT@param renamedColumnNames 修改后所有的字段名  eg: id, isinsider, vipType, groupcode, groupname, grouppicpath, uuid, AESkey FROM currentList*/
-(void)alterTable:(NSString *)tableNamerenameOldColumn:(NSString *)oldColumnName toNewColumn:(NSString *)newColumnName andNewColumnType:(NSString *)newColumnTypewithDatabase:(FMDatabase *)db
allRenamedColumnsAndTypes:(NSString *)renamedColumnsAndTypes allRenamedColumnNames:(NSString *)renamedColumnNames
{if (![db columnExists:oldColumnName inTableWithName:tableName])return;DLog(@"%@表中存在%@字段,修改%@字段名称为%@", tableName, oldColumnName, oldColumnName, newColumnName);// 1.添加新字段if (![db executeUpdate:[NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ %@", tableName, newColumnName, newColumnType]]) {DLog(@"%@修改字段:添加新字段%@失败", tableName, newColumnName);}// 2.将旧字段赋值给新字段if (![db executeUpdate:[NSString stringWithFormat:@"UPDATE %@ SET %@ = %@", tableName, newColumnName, oldColumnName]]) {DLog(@"%@修改字段:%@赋值%@字段失败", tableName, oldColumnName, newColumnName);return;}// 3.删除旧字段(sqlite3无法使用DROP删除字段,先复制备份,再创建新的表)if (![db executeUpdate:@"BEGIN TRANSACTION"]) {DLog(@"BEGIN TRANSACTION失败");}NSString *table_backup = [NSString stringWithFormat:@"%@_backup", tableName];NSString *sql = [NSString stringWithFormat:@"CREATE TEMPORARY TABLE %@(%@)", table_backup, renamedColumnsAndTypes];if (![db executeUpdate:sql]) {DLog(@"CREATE TEMPORARY TABLE %@ 失败", table_backup);}if (![db executeUpdate:[NSString stringWithFormat:@"INSERT INTO %@ SELECT %@ FROM %@", table_backup, renamedColumnNames, tableName]]) {DLog(@"INSERT INTO %@ 失败", table_backup);}if (![db executeUpdate:[NSString stringWithFormat:@"DROP TABLE %@", tableName]]) {DLog(@"DROP TABLE %@ 失败", tableName);}if (![db executeUpdate:[NSString stringWithFormat:@"CREATE TABLE %@(%@)", tableName, renamedColumnsAndTypes]]) {DLog(@"CREATE TABLE %@ 失败", tableName);}if (![db executeUpdate:[NSString stringWithFormat:@"INSERT INTO %@ SELECT %@ FROM %@", tableName, renamedColumnNames, table_backup]]) {DLog(@"INSERT INTO %@ SELECT FROM %@ 失败", tableName, table_backup);}if (![db executeUpdate:[NSString stringWithFormat:@"DROP TABLE %@", table_backup]]) {DLog(@"DROP TABLE %@ 失败", table_backup);}if (![db executeUpdate:@"COMMIT"]) {DLog(@"COMMIT失败");}
}
复制代码

iOS中SQLite3数据库修改字段名相关推荐

  1. ios中SQLite3的基本操作

    本文转自:http://blog.csdn.net/eduora_meimei/article/details/24299133 iOS关于sqlite3操作 iPhone中支持通过sqlite3来访 ...

  2. 创建数据库是列名无效咋办_linux中sqlite3数据库的移植和使用(入门篇)

    1.数据库的安装移植 准备工作: 打开虚拟机,连接share 下载数据库压缩包.不要解压 压缩包网盘地址: 链接:https://pan.baidu.com/s/1ifWV_dPK4l_tbr12I3 ...

  3. linux中sqlite3数据库的基础命令和使用方法

    一.关于sqlite的一些基础概念 sqlite是一种基于Linux的SQL数据库引擎,它体积小,快速,高可靠性,功能齐全,比目前流行的大多数数据库对数据的操作要快. 这篇笔记记录了一些sqlite3 ...

  4. android数据库sqlite3,android NDK中sqlite3数据库的使用

    工做须要使用数据库进行大量的插入工做,故此想经过使用c进行这部分工做,通过查资料,发现一篇文章比较实用: 方法1.使用源码sqlite3.h,sqlite3.c进行编译. 方法2.使用android编 ...

  5. 08.QT中sqlite3数据库基本操作

    Qt版本数据库操作 1 创建项目时选择sql模块 2 简易效果图如下 3 代码如下图所示 #include "SqliteDemo.h" #include <QtSql/QS ...

  6. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...

  7. iOS中持久化存储SQLite(一)

    在iOS中做持久化存储有多种方案,其中包括plist, preference, sqlite, core data,其中: (1)plist, preference适合小型数据存储,因为每次存储前都必 ...

  8. cascade sqlite 数据库_ON DELETE CASCADE无法正常工作在ios中的sqlite3中

    通过启用pragma foreignkeys ON,我以编程方式在ios中创建了一个.sqlite文件 NSFileManager *theFileManager = [NSFileManager d ...

  9. IOS开发基础之SQLite3数据库的使用增删改查

    IOS开发基础之SQLite3数据库的使用增删改查 ios开发我们可能会使用到数据库进行持久化存储.sqlite3 是轻量级的数据库. 今天我们来介绍sqlite3 数据库.此方法跟java的增删改查 ...

最新文章

  1. 这所985大学宣布调查结果:抄袭事实成立!撤销其硕士学位!
  2. SDE要素类导出为shp格式文件
  3. Android 项目,没有可运行的Module项
  4. 我的世界java版做船_“不要在云了,船的合成用木铲?”我的世界:Java和基岩版的差异...
  5. GNOME界面简单使用
  6. EasyUI-在iframe里获取现阶段选中的tab的标题
  7. Python算法、经典面试常见案例题大分享!!!
  8. python win32api sendmessage_python win32api模拟后台鼠标点击的问题。
  9. 2022-2028年中国差旅管理行业市场行情动态及投资潜力研究报告
  10. snmptrap发送消息到服务器,我试图通过snmptrap发送snmp消息
  11. 利用JS代码完成动态生成表格案例及解析
  12. 好用的内网穿透工具汇总
  13. html版权登记怎么打,版权符号怎么输入_Html版权符号怎么打
  14. Python-飞机大战(二)
  15. Rclone挂载SharePoint
  16. matlab的替代品,matlab的开源替代品--octave
  17. hadoop错误:java.io.IOException: There appears to be a gap in the edit log. We expected txid 1
  18. 【JZOJ A组】黑暗之魂(darksoul)
  19. 微信h5缓存清理技巧
  20. 南京logo设计,企业标志商标VI设计

热门文章

  1. 用法 the_【课堂】a、an、the的用法
  2. JAVA1100集,唤醒错误11002
  3. android设置列表id,学习Android绑定列表的时候提示:You must supply a resource ID for a TextView,有完整示例代码...
  4. xamarin拖一个gridview控件报错怎么解决_[笔记阁]Xamarin初探:版式面板(一)
  5. python中列表生成式strip_Python 列表API 序列类型   列表生成
  6. php smarty 分页类,Smarty分页类Smartypaginate
  7. cdmp不停增长 oracle_Stream异常导致Oracle不断产生trc文件
  8. .net 遍历数组找重复值写入一个新数组_面试 | 数组类算法精析
  9. 吴恩达机器学习笔记:(五)区别于微积分的正规方程求解最优解
  10. 【AI不惑境】模型剪枝技术原理及其发展现状和展望