本文转自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. [补充工程统计case]科技活动经费sql2014

    select bd_glorgbook.glorgbookcode,bd_glorgbook.glorgbookname, gl_detail.explanation, bd_accsubj.disp ...

  2. 只适用于HTML的DOM对象

    前面,已经学习了如何对树结构进行遍历,并添加.删除.修改任何XML文档中的节点.但是,还有一些对象和属性石只适用于HTML的.列如,document.body就是一个纯HTML对象.只要HTML文档中 ...

  3. python3爬虫 url管理器

    import urllib.request #python3中将urllib2拆分为了urllib.request.urllib.error.urllib.response等 import http. ...

  4. 一、Owin Identity的使用

    参照http://www.cnblogs.com/r01cn/p/5177708.html教程. 注意点: 1.Nuget包分别下载Microsoft.AspNet.Identity(Owin必须), ...

  5. 因开启SELinux导致httpd报403

    各项权限都检查过了,SELinux允许的端口也找过了.同目录下的其他文件夹是正常的,这个文件夹就抱403. 临时关闭selinux后正常.估计是没有配置运行上下文. chcon -R -t httpd ...

  6. 在sqlserver 中with(nolock)详解

      所有Select加 With (NoLock)解决阻塞死锁        在查询语句中使用 NOLOCK 和 READPAST  处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK  ...

  7. XE6移动开发环境搭建之IOS篇(3):配置虚拟机,设置Mac安装环境(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.创建新的虚拟机 ...

  8. Xcode取消某条警告

      [Xcode取消某条警告] 像下面这样,把双引号“”内的内容替成实际的警告类型即可. #pragma clang diagnostic push #pragma clang diagnostic ...

  9. InnoDB: Error number 24 means ‘Too many open files’.--转载

    一.问题的描述 备份程序 执行前滚的时候报错.(-apply-log) InnoDB: Errornumber 24 means 'Too many open files'. InnoDB: Some ...

  10. 在.net桌面程序中自定义鼠标光标

    有的时候,一个自定义的鼠标光标能给你的程序增色不少.本文这里介绍一下如何在.net桌面程序中自定义鼠标光标.由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下. WinForm程序 ...