笔者在用郭神的litepal数据库时,用到了遍历数据库查用户名:
List<User> users = LitePal.select("username").find(User.class);
Log.e(TAG, "onClick: " + users);
if (users != null && users.size() != 0) {//如果列表(users这个list)不为空,并且列表的size大于0,则可以用foreach遍历
for (User user : users) {
if (strusername.equals(user.getUsername())) {
Toast.makeText(RegistActivity.this, "该用户名已经注册", Toast.LENGTH_SHORT).show();
return;
} else {
//存储用户名密码
user.setUsername(strusername);
user.setPassword(strpassword);
user.save();
Toast.makeText(RegistActivity.this, "创建用户成功", Toast.LENGTH_SHORT).show();
finish();
}
}
} else {
//users数据为空,存数据
User user = new User();
user.setUsername(strusername);
user.setPassword(strpassword);
user.save();
Toast.makeText(RegistActivity.this, "创建用户成功", Toast.LENGTH_SHORT).show();
finish();
}
本来是没有写
if (users != null && users.size() != 0)
这个判断条件的,结果foreach(增强for循环)遍历数据库这部分根本就不跑,直接不跑for循环了。
因为刚对User建立users表时,users表内并没有数据,所以for循环里建立的User的对象user没办法遍历一个没有数据的users表来getUsername。所以说不要遍历空表!!!!如果表内为空就存数据进去!
那么为什么对users这个list判空操作要这么写呢?
当需要对一个list进行判空操作时我们可使用如下两个语句:
判断为空:
if (list == null || list.size() == 0) {}
判断不为空:
if (list != null && list.size() != 0) {}
或者写
if(list!=null&&list.size()>0){}
很多人会以为如果满足 list == null ,这个list就为空了,那么为什么还要再使用另一个条件 list.size == 0 呢?
首先我们需要先弄懂这两个判断条件分别代表什么含义:
list == null :用于判断list有没有初始化,也就是list是否被赋为null,如 List list = null; ,满足该条件的话list中是没有数据的
list.size == 0 :用于判断list中是否有数据,满足该条件时list中也是没有数据的
如果只使用 list == null :一旦list进行了初始化 List list2 = new ArrayList();
,此时list就不再为null了,但list内并没有数据。如果只使用 list == null 来判断是否为空的话,就会判断错误。如果只使用 list .size == 0
:如果list并没有进行初始化,使用该条件时会报空指针错误,就无法达到判空的目的。因此在使用该条件时,一定要判断list是否进行了初始化
总结:
在对list进行判空时,需要使用两个条件:先使用 list == null判断list是否初始化后,再使用 list .size == 0判断是否为空。
双重判断保险嘛