转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40083685

在上一篇文章中,我们学会了使用LitePal进行存储数据的功能。确实,比起直接使用Android原生的API,LitePal明显简单方便了太多。那么,在增删改查四种操作中,我们已经把“增”学完了,今天就让我们继续趁热打铁,学习一下怎样使用LitePal进行改动和删除操作。还没有看过前一篇文章的朋友建议先去參考 Android数据库高手秘籍(五)——LitePal的存储操作

LitePal的项目地址是:https://github.com/LitePalFramework/LitePal

传统的改动和删除数据方式

上篇文章中我们已经得知,SQLiteDatabase类中提供了一个insert()方法用于插入数据,那么相似地,它还提供了update()和delete()这两个方法,分别用于改动和删除数据。先来看一下update()方法的方法定义:

public int update(String table, ContentValues values, String whereClause, String[] whereArgs)

update()方法接收四个參数,第一个參数是表名,第二个參数是一个封装了待改动数据的ContentValues对象,第三和第四个參数用于指定改动哪些行,相应了SQL语句中的where部分。

那么比方说我们想把news表中id为2的记录的标题改成“今日iPhone6公布”,就能够这样写:

SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("title", "今日iPhone6公布");
db.update("news", values, "id = ?", new String[] {"2"});

其作用相当于例如以下SQL语句:

update news set title='今日iPhone6公布' where id=2;

能够看出,比起直接使用SQL语句,update()方法的语义性明显更强,也更easy让人理解。

接下来再看一下delete()方法的方法定义:

public int delete(String table, String whereClause, String[] whereArgs)

delete()方法接收三个參数,第一个參数相同是表名,第二和第三个參数用于指定删除哪些行,相应了SQL语句中的where部分。

那么比方说我们想把news表中全部没有评论的新闻都删除掉,就能够这样写:

SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("news", "commentcount = ?", new String[] {"0"});

其作用相当于例如以下SQL语句:

delete from news where commentcount=0;

由此可见,Android给我们提供的这些帮助方法,在非常大程度上确实简化了不少数据库操作的复杂度。只是LitePal显然做到了更好,以下就让我们学习一下怎样使用LitePal来进行改动和删除操作。

使用LitePal改动数据

LitePal改动数据的API比較简单,并没有什么太多的使用方法,也比較好理解,方法都是定义在DataSupport类中的,我们先来看一下方法定义:

public static int update(Class<?> modelClass, ContentValues values, long id)

这个静态的update()方法接收三个參数,第一个參数是Class,传入我们要改动的那个类的Class就好,第二个參数是ContentValues对象,这三个參数是一个指定的id,表示我们要改动哪一行数据。

那么比方说我们想把news表中id为2的记录的标题改成“今日iPhone6公布”,就能够这样写:

ContentValues values = new ContentValues();
values.put("title", "今日iPhone6公布");
DataSupport.update(News.class, values, 2);

能够看出,整体来讲还是比原生的使用方法要简单一些的,首先我们避免掉了要去获取SQLiteDatabase对象的步骤,其次在指定改动某一条id记录的时候仅仅须要传入这个id即可,语法更简练。

那么有的朋友可能会问了,或许我想改动的是某一个条件下的全部数据,而不是仅仅改动某个id的数据,那该怎么办呢?别操心,LitePal还提供了另外一个简便的方法,方法定义例如以下:

public static int updateAll(Class<?> modelClass, ContentValues values, String... conditions)

updateAll()方法表示改动多行记录,当中第一个參数仍然是Class,第二个參数还是ContentValues对象,第三个參数是一个conditions数组,用于指定改动哪些行的约束条件,返回值表示此次改动影响了多少行数据。

那么比方说我们想把news表中标题为“今日iPhone6公布”的全部新闻的标题改成“今日iPhone6 Plus公布”,就能够这样写:

ContentValues values = new ContentValues();
values.put("title", "今日iPhone6 Plus公布");
DataSupport.updateAll(News.class, values, "title = ?", "今日iPhone6公布");

前面都没什么好说的,重点我们看一下最后的这个conditions数组,由于它的类型是一个String数组,我们能够在这里填入随意多个String參数,当中最前面一个String參数用于指定约束条件,后面全部的String參数用于填充约束条件中的占位符(即?号),比方约束条件中有一个占位符,那么后面就应该填写一个參数,假设有两个占位符,后面就应该填写两个參数,以此类推。

比方说我们想把news表中标题为“今日iPhone6公布”且评论数量大于0的全部新闻的标题改成“今日iPhone6 Plus公布”,就能够这样写:

ContentValues values = new ContentValues();
values.put("title", "今日iPhone6 Plus公布");
DataSupport.updateAll(News.class, values, "title = ? and commentcount > ?", "今日iPhone6公布", "0");

能够看出,通过占位符的方式来实现条件约束明显要比原生的API更加简单易用。

那么假设我们想把news表中全部新闻的标题都改成“今日iPhone6公布”,该怎么写呢?事实上这就更简单了,仅仅须要把最后的约束条件去掉即可了,例如以下所看到的:

ContentValues values = new ContentValues();
values.put("title", "今日iPhone6 Plus公布");
DataSupport.updateAll(News.class, values);

怎么样,这样的写法是不是感觉语义性非常强?updateAll()方法在不指定约束条件的情况下就是改动全部行的数据,的的确确是update all了。

当然有些朋友可能会认为这样用起来还是有点复杂,由于这个ContentValues对象非常烦人,每次创建它的时候都要写非常多繁琐的代码。没关系,LitePal也充分考虑了这样的情况,提供了一种不须要ContentValues就能改动数据的方法,以下我们尝试使用这样的新方法来完毕上述相同的功能。

比方把news表中id为2的记录的标题改成“今日iPhone6公布”,就能够这样写:

News updateNews = new News();
updateNews.setTitle("今日iPhone6公布");
updateNews.update(2);

这次我们并没实用ContentValues,而是new出了一个News对象,把要改动的数据直接set进去,最后调用一下update()方法并传入id就能够了。不仅不用创建ContentValues对象,连表名都不用指定了,由于News对象默认就是改动的news表。

这是当中一种使用方法,那么假设我们想把news表中标题为“今日iPhone6公布”且评论数量大于0的全部新闻的标题改成“今日iPhone6 Plus公布”,就能够这样写:

News updateNews = new News();
updateNews.setTitle("今日iPhone6公布");
updateNews.updateAll("title = ? and commentcount > ?", "今日iPhone6公布", "0");

还是非常好理解的,这里我就不再详解了。

可是这样的使用方法有一点须要注意,就是假设我们想把某一条数据改动成默认值,比方说将评论数改动成0,仅仅是调用updateNews.setCommentCount(0)这样是不能改动成功的,由于即使不调用这行代码,commentCount的值也默认是0。所以假设想要将某一列的数据改动成默认值的话,还须要借助setToDefault()方法。使用方法也非常easy,在setToDefault()方法中传入要改动的字段名就能够了(类中的字段名),比方说我们想要把news表中全部新闻的评论数清零,就能够这样写:

News updateNews = new News();
updateNews.setToDefault("commentCount");
updateNews.updateAll();

使用LitePal删除数据

LitePal删除数据的API和改动数据是比較相似的,可是更加的简单一些,我们先来看一下DataSupport类中的方法定义,例如以下所看到的:

public static int delete(Class<?> modelClass, long id)

delete()方法接收两个參数,第一个參数是Class,传入我们要删除的那个类的Class就好,第二个參数是一个指定的id,表示我们要删除哪一行数据。

那么比方说我们想删除news表中id为2的记录,就能够这样写:

DataSupport.delete(News.class, 2);

须要注意的是,这不仅仅会将news表中id为2的记录删除,同一时候还会将其他表中以news id为2的这条记录作为外键的数据一起删除掉,由于外键既然不存在了,那么这么数据也就没有保留的意义了。

说起来可能有点拗口,我们还是举例看一下。比方news表中眼下有两条数据,例如以下图所看到的:

然后comment表中也有两条数据,例如以下图所看到的:

当中comment表中两条数据的外键都是2,指向的news表中id为2的这条记录。那么以下我们运行例如以下删除语句:

int deleteCount = DataSupport.delete(News.class, 2);
Log.d("TAG", "delete count is " + deleteCount);

当中delete()方法的返回值表示被删除的记录数,打印结果例如以下所看到的:

能够看到,有三条记录被删除了,那我们再到news表中查询一下:

OK,仅仅剩下一条记录了,id为2的那条记录确实被删除了。那么再到comment表中看一下呢,例如以下图所看到的:

数据全没了!为什么呢?由于comment表中的两条数据都是以news表中id为2的数据作为外键的,如今外键不存在了,那么这两条数据自然也没有存在的意义了,因此被删除的记录数一共是3条。这样是不是就好理解了非常多呢?

除了删除指定id的数据之外,DataSupport中也提供了一个通过where语句来批量删除数据的方法,先看一下方法定义:

public static int deleteAll(Class<?> modelClass, String... conditions)

看起来非常眼熟吧?非常easy,deleteAll()方法接收两个參数,第一个參数是Class,传入我们要删除的那个类的Class就好,第二个參数是一个conditions数组,用于指定删除哪些行的约束条件,返回值表示此次删除了多少行数据,使用方法和updateAll()方法是基本相同的。

那么比方说我们想把news表中标题为“今日iPhone6公布”且评论数等于0的全部新闻都删除掉,就能够这样写:

DataSupport.deleteAll(News.class, "title = ? and commentcount = ?", "今日iPhone6公布", "0");

而假设我们想把news表中全部的数据全部删除掉,就能够这样写:

DataSupport.deleteAll(News.class);

在不指定约束条件的情况下,deleteAll()方法就会删除表中全部的数据了。

除了DataSupport类中提供的静态删除方法之外,另一个删除方法是作用于对象上的,即不论什么一个继承自DataSupport类的实例都能够通过调用delete()这个实例方法来删除数据。但前提是这个对象一定是要持久化之后的,一个非持久化的对象假设调用了delete()方法则不会产生不论什么效果。

比方说以下这样的写法:

News news = new News();
news.delete();

这里new出了一个News对象,这个对象明显是没有持久化的,那么此时调用delete()方法则不会删除不论什么数据。

但假设我们之前将这个对象持久化过了,那么再调用delete()方法就会把这个对象相应的数据删除掉了,比方:

News news = new News();
news.setTitle("这是一条新闻标题");
news.setContent("这是一条新闻内容");
news.save();
...
news.delete();

一个对象假设save过了之后,那就是持久化的了。除了调用save()方法之外,通过DataSupport中提供的查询方法从数据库中查出来的对象也是经过持久化的,查询的功能我们会在下篇博客中解说。

另外另一个简单的办法能够帮助我们推断一个对象是否是持久化之后的,DataSupport类中提供了一个isSaved()方法,这种方法返回true就表示该对象是经过持久化的,返回false则表示该对象未经过持久化。那么删除一个对象相应的数据也就能够这样写了:

News news;
...
if (news.isSaved()) {
news.delete();
}

好了,这样我们就把LitePal中提供的改动和删除数据操作的使用方法基本都学习完了,那么今天的文章就到这里,下一篇文章中会開始解说查询数据的使用方法,感兴趣的朋友请继续阅读 Android数据库高手秘籍(七)——体验LitePal的查询艺术 。

LitePal开源项目地址:https://github.com/LitePalFramework/LitePal

Android数据库高手秘籍(六)——LitePal的改动和删除操作的更多相关文章

  1. Android数据库高手秘籍(五)——LitePal的存储操作

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/39345833 经过前面几篇文章的学习,我们已经把LitePal的表管理模块的功能都 ...

  2. Android数据库高手秘籍(三)——使用LitePal升级表

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/39151617 在上一篇文章中,我们学习了LitePal的基本使用方法,体验了使用框 ...

  3. Android数据库高手秘籍(二):创建表和LitePal的基本用法

    原文:http://blog.jobbole.com/77157/ 上一篇文章中我们学习了一些Android数据库相关的基础知识,和几个颇为有用的SQLite命令,都是直接在命令行操作的.但是我们都知 ...

  4. Android数据库高手秘籍(一)——SQLite命令

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...

  5. Android数据库高手秘籍(零)——前言

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38083103 在我刚開始接触Android的时候甚至都不敢相信.Android系统 ...

  6. Android数据库高手秘籍:SQLite命令

    要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能.虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,增删改查,大家还是必须要学会的. SQL ...

  7. Android数据库专家秘籍(七)经验LitePal查询艺术

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40153833 经过了多篇文章的学习,我们已经把LitePal中的绝大部分内容都掌握 ...

  8. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  9. LitePal的修改和删除操作

    转载出处:http://blog.csdn.net/guolin_blog/article/details/40083685 传统的修改和删除数据方式   上篇文章中我们已经得知,SQLiteData ...

随机推荐

  1. oralce 获取自定义主键编码,有并发问题

    F_GET_SEQUENCE,功能函数,当多个服务同时调用此函数,可能产生并发问题,待解决,加主键. CREATE OR REPLACE Function f_Get_Sequence(As_Comp ...

  2. rhel5.8 ISO yum源配置

    [root@lei1 mnt]# mkdir /mnt/iso [root@lei1 mnt]# mkdir /mnt/cdrom [root@lei1 ~]# mv rhel-server-5.8- ...

  3. Java线程学习笔记(两) 线程异常处理

    线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{ @Ove ...

  4. Chrome 控制台不完全指南(转)

    Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...

  5. 怎样配置git ssh连接,怎样在GitHub上加入协作开发人员,怎样配置gitignore和怎样在GitHub上删除资源库.

    **********1.在运行git push origin master指令时报例如以下错误: iluckysi@ILUCKYSI-PC /d/ilucky/message/code (master ...

  6. HDU 1274 展开字符串 (递归+string类)

    题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<st ...

  7. Java他们其中一个IO(一)

    1.I/O 操作的目标 其中从数据源读取数据,和写数据到的目标位置数据. 2.IO 的分类方法 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc ...

  8. 小代码编写神器:LINQPad 使用入门

    原文:小代码编写神器:LINQPad 使用入门 一:概述 1:想查看程序运行结果,又不想启动 VS 怎么办? 2:想测试下自己的 C# 能力,不使用 VS 的智能感知,怎么办? 那么,我们有一个选择, ...

  9. String构造函数originalValue.length&gt;size 它发生

    最近观看Jdk6于String源代码被发现String这种施工方法有.源内容如下面: public String(String original) { int size = original.coun ...

  10. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...