本文转自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. Mysql对用户操作加审计功能——高级版

    在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化.我们可以在这里获取用户的登录名称和thread的ID值.然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等 ...

  2. PostMessager来对子父窗体进行跨域

    一.为什么需要使用postMessage这个跨域技术 对于一个普通的页面而言,如果页面中的数据量太多时,会导致某个页面的数据量太多 二显得特别的臃肿,所以通常是使用iframe的方式来加载子页面,但是 ...

  3. System.Data.SQLite

    SQLite介绍 在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义.表.索引和数据本身 ...

  4. Linux定时任务系统 Cron

    运行计划任务时:service crond restart提示:crond: unrecognized service安装计划任务:yum -y install vixie-cron 另外附计划任务的 ...

  5. 利用WCF的双工通讯实现一个简单的心跳监控系统 z

    利用WCF的双工通讯实现一个简单的心跳监控系统 http://www.cnblogs.com/zuowj/p/5761011.html 何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态 ...

  6. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  7. 剑指Offer:面试题28——字符串的排列(java实现)(待序)

    问题描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母 ...

  8. 4,SFDC 管理员篇 - 数据模型 - 基本对象

    Setup | Customize | Object Name | Filed   1, 标准字段定义 standard field:系统字段,不能删除,但是能在页面中remove non-requi ...

  9. 一千行MySQL学习笔记

    以下为本人当年初学MySQL时做的笔记,也从那时起没再更新过,但还是囊括了基本的知识点,有时还翻出来查查.是不是干货,就看亲们了~ 如果哪天笔记有更新了,我还是会更新该文章滴,其实笔记已经放到了Git ...

  10. C++学习基础九——继承

    1.不同于Java中通过extends实现继承,C++是通过:实现的. 2.C++中同样包含public,private,protected三个关键字: public关键字表示在任意其他类中可调用该成 ...