LitePal修改数据的API比较简单,并没有什么太多的用法,也比较好理解,方法都是定义在DataSupport类中的,我们先来看一下方法定义:
public static int update(Class> modelClass, ContentValues values, long id)
这个静态的update()方法接收三个参数,第一个参数是Class,传入我们要修改的那个类的Class就好,第二个参数是ContentValues对象,这三个参数是一个指定的id,表示我们要修改哪一行数据。
那么比如说我们想把person表中姓名为“第一人”的所有姓名改成“第三人”,就可以这样写:
ContentValues values = new ContentValues();
values.put("name", "第三人");
DataSupport.updateAll(Person.class, values, 1);
效果如下:
可以看出,总体来讲还是比原生的用法要简单一些的,首先我们避免掉了要去获取SQLiteDatabase对象的步骤,其次在指定修改某一条id记录的时候只需要传入这个id即可,语法更简练。
那么有的朋友可能会问了,也许我想修改的是某一个条件下的所有数据,而不是仅仅修改某个id的数据,那该怎么办呢?别担心,LitePal还提供了另外一个简便的方法,方法定义如下:
public static int updateAll(Class> modelClass, ContentValues values, String... conditions)
updateAll()方法表示修改多行记录,其中第一个参数仍然是Class,第二个参数还是ContentValues对象,第三个参数是一个conditions数组,用于指定修改哪些行的约束条件,返回值表示此次修改影响了多少行数据。
还是上面的案例,此时代码写法:
ContentValues values = new ContentValues();
values.put("name", "第三人");
DataSupport.updateAll(Person.class, values, "name = ? and id> ?" , "第二人","1");
重点我们看一下最后的这个conditions数组,由于它的类型是一个String数组,我们可以在这里填入任意多个String参数,其中最前面一个String参数用于指定约束条件,后面所有的String参数用于填充约束条件中的占位符(即?号),比如约束条件中有一个占位符,那么后面就应该填写一个参数,如果有两个占位符,后面就应该填写两个参数,以此类推。
当然有些朋友可能会觉得这样用起来还是有点复杂,因为这个ContentValues对象很烦人,每次创建它的时候都要写很多繁琐的代码。没关系,LitePal也充分考虑了这种情况,提供了一种不需要ContentValues就能修改数据的方法,下面我们尝试使用这种新方法来完成上述同样的功能。
案例同上:
Person updatePerson = new Person ();
updatePerson .setName("第三人");
updatePerson .update(1);
这次我们并没有用ContentValues,而是new出了一个Person对象,把要修改的数据直接set进去,最后调用一下update()方法并传入id就可以了。不仅不用创建ContentValues对象,连表名都不用指定了,因为News对象默认就是修改的news表。
另外一种使用占位符的写法:
Person updatePerson = new Person ();
updatePerson .setName("第三人");
updatePerson .update("name = ?" , "第二人");
但是这种用法有一点需要注意,就是如果我们想把某一条数据修改成默认值,比如说将评论数修改成0,只是调用updateNews.setCommentCount(0)这样是不能修改成功的,因为即使不调用这行代码,commentCount的值也默认是0。所以如果想要将某一列的数据修改成默认值的话,还需要借助setToDefault()方法。用法也很简单,在setToDefault()方法中传入要修改的字段名就可以了(类中的字段名),比如说我们想要把news表中所有新闻的评论数清零,就可以这样写:
Person updatePerson = new Person ();
updatePerson .setToDefault("info");
updatePerson .updateAll();
我们先来看一下DataSupport类中的方法定义:
public static int delete(Class> modelClass, long id)
delete()方法接收两个参数,第一个参数是Class,传入我们要删除的那个类的Class就好,第二个参数是一个指定的id,表示我们要删除哪一行数据。
那么比如说我们想删除person表中id为1的记录,就可以这样写:
DataSupport.delete(Person.class, 1);
需要注意的是,这不仅仅会将person表中id为1的记录删除,同时还会将其它表中以id为1的这条记录作为外键的数据一起删除掉,因为外键既然不存在了,那么这么数据也就没有保留的意义了。
除了删除指定id的数据之外,DataSupport中也提供了一个通过where语句来批量删除数据的方法,先看一下方法定义:
public static int deleteAll(Class> modelClass, String... conditions)
deleteAll()方法接收两个参数,第一个参数是Class,传入我们要删除的那个类的Class就好,第二个参数是一个conditions数组,用于指定删除哪些行的约束条件,返回值表示此次删除了多少行数据,用法和updateAll()方法是基本相同的。
在不指定约束条件的情况下,deleteAll()方法就会删除表中所有的数据了。
除了DataSupport类中提供的静态删除方法之外,还有一个删除方法是作用于对象上的,即任何一个继承自DataSupport类的实例都可以通过调用delete()这个实例方法来删除数据。但前提是这个对象一定是要持久化之后的,一个非持久化的对象如果调用了delete()方法则不会产生任何效果。
Person person = new Person ();
person .delete();
这里new出了一个Person 对象,这个对象明显是没有持久化的,那么此时调用delete()方法则不会删除任何数据。
但如果我们之前将这个对象持久化过了,那么再调用delete()方法就会把这个对象对应的数据删除掉了,比如:
Person person = new Person ();
news.setName("即将删除");
person .save();
...
person .delete();
一个对象如果save过了之后,那就是持久化的了。除了调用save()方法之外,通过DataSupport中提供的查询方法从数据库中查出来的对象也是经过持久化。
另外还有一个简单的办法可以帮助我们判断一个对象是否是持久化之后的,DataSupport类中提供了一个isSaved()方法,这个方法返回true就表示该对象是经过持久化的,返回false则表示该对象未经过持久化。那么删除一个对象对应的数据也就可以这样写了:
Person person;
...
if (person.isSaved()) {
person.delete();
}
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40083685