Android数据库高手秘籍(六)——LitePal的改动和删除操作

转载请注明出处: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值