前一篇文章介绍了LitePal的引入和基础配置,这一篇我们来介绍一下增删改查等操作,源码。
代码如下(示例):
UserEntity userEntity = new UserEntity();
userEntity.setAccount(account);
userEntity.setPassword(password);
userEntity.setName(name);
userEntity.setPhone(phone);
boolean result = userEntity.save();
新增方法很简单不需要使用SQLiteDatabase、ContentValues等,只需要new出一个对象,然后把要存储的数据通过setter方法传入,最后调用一下save()方法就可以。save()回返回一个boolean值,用于表示存储成功还是失败。
save()方法虽然可以根据返回值来判断是否存储成功,但是不会抛出失败的异常,如果我们要查找存储失败的异常,而不是返回一个false,那就可以使用saveThrows()方法来代替。代码如下:
UserEntity userEntity = new UserEntity();
userEntity.setAccount(account);
userEntity.setPassword(password);
userEntity.setName(name);
userEntity.setPhone(phone);
userEntity.saveThrows();
上面的方法都是介绍的存储单个实体的方法。如果我们存储多个实体,可以使用 LitePal.saveAll()方法。
代码如下:
List<UserEntity> list= new ArrayList();
UserEntity userEntity1 = new UserEntity();
userEntity1 .setAccount(“aaa”);
userEntity1 .setPassword(“aaa”);
userEntity1 .setName(“aaa”);
userEntity1 .setPhone(“111111111”);
UserEntity userEntity2 = new UserEntity();
userEntity2 .setAccount(“bbb”);
userEntity2 .setPassword(“bbb”);
userEntity2 .setName(“bbb”);
userEntity2 .setPhone(“2222222”);
UserEntity userEntity3 = new UserEntity();
userEntity3 .setAccount(“ccc”);
userEntity3 .setPassword(“ccc”);
userEntity3 .setName(“ccc”);
userEntity3 .setPhone(“3333333”);
list.add(userEntity1);
list.add(userEntity2 );
list.add(userEntity3 );
boolean result = LitePal.saveAll(list);
实体类不光有保存的save()方法也有删除的delete()方法,delete()方法的对象一定是要持久化之后的(即已保存到数据库),一个非持久化的对象如果调用了delete()方法则不会产生任何效果。这个delete()方法返回值是一个int值,即删除数据的条数,0表示删除了0条数据(删除失败)。代码如下:
UserEntity userEntity = new UserEntity();
userEntity .setAccount(“ccc”);
userEntity .setPassword(“ccc”);
userEntity .setName(“ccc”);
userEntity .setPhone(“3333333”);
int result = userEntity.delete();
//此时result 结果为0,因为这个实体还没有存储到数据库中
userEntity.save();
int result = userEntity.delete();
//此时result 结果为1,表示删除了1条数据
实体类中isSaved()方法可以判断这个实体是否保存
if (userEntity.isSaved()) {
userEntity.delete();
}
LitePal.delete()方法可以根据ID来删除数据,这个方法有两个参数,第一个参数是Class,传入我们要删除的那个类的Class就好,第二个参数是一个指定的id,表示我们要删除的数据。
代码如下:
//删除UserEntity表中 中 id为2的数据
LitePal.delete(UserEntity.class,2);
LitePal.deleteAll() 方法可以删除多条数据,这个方法有3个参数,第一个参数是Class,传入我们要删除的那个类的Class就好,第二个参数是判断条件
代码如下:
//删除UserEntity表中 中 account =aaa 的数据
LitePal.deleteAll(UserEntity.class, "account = ?" , "aaa");
//删除UserEntity表中 中 account =aaa且name = bbb 的数据
LitePal.deleteAll(UserEntity.class, "account = ? and name = ? ", "aaa","bbb");
//清空UserEntity表中数据
LitePal.deleteAll(UserEntity.class);
根据ID修改更新数据也有两种方式一种是用实体类的更新方法,new出了一个实体对象,把要修改的数据直接set进去,最后调用一下update()方法并传入id就可以了,代码如下:
//将UserEntity表中id为1的数据中的phone字段更新为1593267891
UserEntity userEntity =new UserEntity();
userEntity.setPhone("1593267891");
userEntity.update(1);
第二种方式是 LitePal.update()方法,这个方法有三个参数,第一个参数是Class,传入我们要修改的那个类的Class就好,第二个参数是ContentValues对象,这三个参数是一个指定的id,表示我们要修改哪一行数据,代码如下:
ContentValues values = new ContentValues();
values.put("phone", "1593267891");
LitePal.update(UserEntity.class,values,1);
批量更新数据也有两种方式,第一种方式是用实体类的更新方法同样是new出了一个实体对象,把要修改的数据直接set进去,不过要调用updateAll()方法,如果没有参数就是更新全部,有参数的话就是根据条件进行更新
代码如下:
UserEntity userEntity =new UserEntity();
userEntity.setPhone("1593267891");
//更新全部数据,将phone字段都改为1593267891
userEntity.updateAll();
//根据条件更新将account =aaa的数据的phone字段都改为1593267891
userEntity.updateAll("account = ?" , "aaa");
第二种方式是 LitePal.updateAll()方法,代码如下:
ContentValues values = new ContentValues();
values.put("phone", "1593267891");
//更新UserEntity实体的全部数据,将phone字段都改为1593267891
LitePal.updateAll(UserEntity.class,values);
//根据条件更新UserEntity实体z中account =aaa的数据的phone字段都改为1593267891
LitePal.updateAll(UserEntity.class,values,"account = ?" , "aaa");
简单查询的操作方法有LitePal中的find()、findFirst()、findLast ()、findAll()这几个方法。
其中findFirst()、findLast ()是查询相应实体的第一个和最后一个数据,参数为相应的实体类。
UserEntity userEntity1 = LitePal.findFirst(UserEntity.class);
UserEntity userEntity2 = LitePal.findLast(UserEntity.class);
find()方法是根据实体类的ID进行查询。
UserEntity userEntity3 =LitePal.find(UserEntity.class,2);
findAll()方法是根据实体类的条件进行查询
//查询多个ID的数据
List<UserEntity> userEntityList1 = LitePal.findAll(UserEntity.class, 1, 3, 5, 7);
long[] ids = new long[] { 1, 3, 5, 7 };
List<UserEntity> userEntityLis2 = LitePal.findAll(UserEntity.class, ids);
//查询全部数据
List<UserEntity> userEntityLis3 = LitePal.findAll(UserEntity.class);
先调用LitePal的where()方法,在这里指定了查询条件。where()方法接收任意个字符串参数,其中第一个参数用于进行条件约束,从第二个参数开始,都是用于替换第一个参数中的占位符的。那这个where()方法就对应了一条SQL语句中的where部分。
接着我们在where()方法之后直接连缀了一个find()方法,然后在这里指定一个泛型类,表示用于查询哪张表。
代码如下:
List<UserEntity> userEntityLis4 = LitePal.where("account = ?", "aaa").find(UserEntity.class);
这个查询结果跟下面的sqL语句是相同的。
select * from userentity where account ="aaa";
同时还可以使用select()这个方法接收任意个字符串参数,每个参数要求对应一个列名,这样就只会把相应列的数据查询出来了。order()方法中接收一个字符串参数,用于指定查询出的结果按照哪一列进行排序,asc表示正序排序,desc表示倒序排序。limit()方法,这个方法接收一个整型参数,用于指定查询前几条数据,这里指定成10,意思就是查询所有匹配结果中的前10条数据。offset()方法,用于指定查询结果的偏移量,这里指定成10,就表示偏移十个位置,那么原来是查询前10条新闻的,偏移了十个位置之后,就变成了查询第11到第20条新闻了,如果偏移量是20,那就表示查询第21到第30条新闻,以此类推。
代码如下:
List<UserEntity> newsList = LitePal.select("account", "name")
.where("account = ?", "aaa")
.order("id desc").limit(10).offset(10)
.find(UserEntity.class);
这个查询结果跟下面的sqL语句是相同的。
select account,name from userentity where account ="aaa" order by id desc limit 10,10;
findBySQL()方法,使用这个方法就能通过原生的SQL语句方式来查询数据,这个方法接收任意个字符串参数,其中第一个参数就是SQL语句,后面的参数都是用于替换SQL语句中的占位符的,用法非常简单。另外,findBySQL()方法返回的是一个Cursor对象,这和原生SQL语句的用法返回的结果也是相同的。
Cursor cursor = LitePal.findBySQL("select * from userentity where account =?", "aaa");
int idIndex = cursor.getColumnIndex("id");
int accountIndex = cursor.getColumnIndex("account");
int passwordIndex = cursor.getColumnIndex("password");
int nameIndex = cursor.getColumnIndex("name");
int phoneIndex = cursor.getColumnIndex("phone");
userList.clear();
while (cursor.moveToNext()) {
int id = cursor.getInt(idIndex);
String account = cursor.getString(accountIndex);
String password = cursor.getString(passwordIndex);
String name = cursor.getString(nameIndex);
String phone = cursor.getString(phoneIndex);
UserEntity userEntity = new UserEntity();
userEntity.setId(id);
userEntity.setAccount(account);
userEntity.setPassword(password);
userEntity.setName(name);
userEntity.setPhone(phone);
userList.add(userEntity);
}