本文转自http://www.ithao123.cn/content-933827.html,在此感谢作者

android数据库操作,有两种方式,一种用android提供给我们的数据库操作函数insert、update、replace,我用到的就是这三种。另外一种方式就是利用数据库语言进行操作,也就是利用execSQL这个函数后面带sqlite数据库操作语言进行操作,sqlite中的sql语言和标准的sql语言大同小异,但是你如果是想有针对性的了解,建议你买一本书《SQLite权威指南》,这本书是sqlite官方网站推荐的,我买的是中文版的,当当上就有的卖。

这里主要讲的几个容易混淆的点:

第一:android给我们的replace函数,这个函数其实相当于sql语言中的insert or update,大致是这个意思,意思是假如表中你定义的唯一的字段,比如_id=1,是主键!你利用contentvalues传入的参数中,假如_id为1的字段是表中存在的,那么就不会重新生成一条记录,而是Update当前行,当然,这个和update有很大的区别,replace会完全把所有信息给抹掉,然后根据你给出的约束条件,比如:默认值等之类的信息,重新生成一条字段。反之,不存在你给定的_id字段,那么会生成一条新的_id=1的字段。

第二:android给定的update函数,如果你使用的update函数,假如,你update_id=1的字段,如果表中不存在_id=1的字段,那么是会报错的。而你用sqlite语句执行同样的操作,update同样的字段,假如不存在_id=1的字段,它不会执行任何操作,也不会报错。这是他们的区别。

第三:冲突解决,这一块比较复杂,本人也没有搞的十分清楚。你可以在表里定义冲突解决,也可以在字段上定义冲突解决。首先,你用android给出的函数,是不能完成冲突解决的,也有可能是我没有发现这样功能的函数?我们通常用sql语句,insert or ignore这样的形式来实现sql语句的冲突解决。但是sql语句的冲突解决貌似没有字段级的冲突解决好用。我们来讲一下字段级别的冲突解决,比如,你想实现一个这样的功能:你要在一张表里面插入记录,你想新插入表里_id值不存在的字段,但是又不想破坏掉_id已经存在的任何信息,那么你可以在_id字段设置唯一,并且在唯一的基础上设置冲突解决为ignore,这样,既插入了你想要插入的数据,也原封不动的保留了那些你不想破坏的数据。其他的冲突解决,fail是当约束违反发生时,sqlite命令立马终止,报错!但是不恢复约束违反之前已经修改的记录,这样很不好,所以不推荐使用。replace这个很好理解,当违反唯一约束的时候,sqlite将造成这种违反的记录删除,也就是删除原来的记录,插入新的记录,经过调试,replace并不保存原来的记录的任何信息。abort,当约束违反发生时,sqlite恢复命令所做的所有改变并且终止命令。这是sqlite的默认冲突解决方案,也是sql标准定义的行为。最后一个是rollback,很好理解,当违反约束的动作发生时,终止当前命令和整个事物,当前事务和命令所做的任何操作和改变都将被回滚!

这样,你可以用insert配合字段级别的ignore可以完成条件针对_id或者其他字段的update操作,弥补了android的update报错,和sql语句中update操作针对_id不存在的字段不添加的缺陷。

sqlite中的replace、insert、update之前的区别的更多相关文章

  1. 在Sqlite中通过Replace来实现插入和更新

      你可能在批量处理一个事务的时候,想要批量插入一系列的数据,但是这些数据当添加完一次之后,重新添加的时候,你不想要重新添加,只是想将原有的数据进行更新,例如:我想要通过Excel将一系列的图书导入到 ...

  2. SQLite中特殊的INSERT语句

    SQLite中特殊的INSERT语句   在SQLite中,INSERT是基本语句,用来向表中插入数据.但是当表中存在字段存在唯一.非空.检查.主键等约束时,插入的数据很容易和约束冲突,造成插入操作失 ...

  3. JAVA中string.replace()和string.replaceAll()的区别及用法

    乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样.    public String r ...

  4. 《oracle每天一练》Merge Into 语句代替Insert/Update在Oracle中的应用实战

    转载自窃破天道 动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也 ...

  5. Merge Into 语句代替Insert/Update在Oracle中的应用实战

    动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...

  6. Sqlite数据多表联合update

    其实在Mysql中,多表联合update不是什么难事. 语法: 1 UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ... ...

  7. 使用Merge Into 语句实现 Insert/Update

    网址: http://www.eygle.com/digest/2009/01/merge_into_insertupdate.html 动机: 想在Oracle中用一条SQL语句直接进行Insert ...

  8. Oracle Merge Into Insert/Update

    出自:http://blog.csdn.net/yuzhic/article/details/1896878 动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明 ...

  9. oracle中execute immediate的使用(select/insert/update/delete)(转)

    execute immediate的语法如下: execute immediate 'sql'; execute immediate 'sql_select' into var_1, var_2; e ...

随机推荐

  1. linux 下 文件权限和文件主

    文件与文件夹的权限和所有者 1.chmod -R 755 file 777 含义与来源: 777含义:分别为:所有者.同组用户.其他用户 7的来源:文件有三种操作模式:读4.写2.执行1,分别值为42 ...

  2. activiti自定义流程之整合(六):获取我的申请任务

    流程启动后,流程节点便进入到了任务相关的部分.可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据.实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的 ...

  3. zxing 一维码部分深入分析与实际应用,识别卡片数量,Android数卡器

    打算修改zxing 源码应用到其它方面,所以最近花了点时间阅读其源码,无意中找到这篇博客,条码扫描二维码扫描——ZXing android 简化源码分析 对过程的分析还是可以参考的.原作者给出的一个基 ...

  4. H5课程大纲

    K1模块课程: 课程模块 课程阶段 课程内容 K1 模块 第1阶段 认识前端开发 环境配置.使用标签的分类.写法及使用规范CSS样式的使用.各类常见样式Photoshop使用16大常用样式盒模型.语义 ...

  5. ECSHOP通过改变模板路径制作手机站

    ECSHOP通过改变模板路径制作手机站 前提:不使用ECSHOP自带的mobile目录程序来制作手机站. 目的:手机站做成自动识别,通过改变模板路径来显示PC站或手机站. 待续

  6. java基础要点

    Java语言是现在比较常用的编程语言,因为Java语言可以编写桌用程序,也可以编写web程序,还能编写嵌入式程序.这是由于相比脚本语言,Java 的运行速度要快.而对于底层语言,Java与平台无关,可 ...

  7. WCF netTcp配置

    服务端配置 <system.serviceModel> <bindings> <netTcpBinding> <binding name="netT ...

  8. php disk_free_space与disk_total_space实例介绍

    php disk_free_space 函数与disk_total_space 函数教程,第一个函数是指函数返回的空间,以字节为单位,在指定的目录,而disk_total_space 函数返回的总空间 ...

  9. 使用DotNetOpenAuth搭建OAuth2.0授权框架

    标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0. ...

  10. Libevent 定时器

    先摘一点网上的介绍 libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名分布式缓存软件 ...