我是android新手,决定学习greenDao ORM并在我的测试项目中使用它。
我正在创建一个User对象列表。每个用户注册可以有多个子项。所以我将userId保存在子对象中以便能够找到用户的孩子。
每个孩子都有一个电话号码。这些电话号码很独特。所以,当我想为用户插入一个孩子时,我应该检查孩子的电话号码是否应该存在于表格中。
为此,我创建了一个QueryBuilder,它从数据库中获取所有子对象。QueryBuilder<Child> childQuery = childDao().queryBuilder()
.where(ChildeDao.Properties.UserId.eq(child.getUserId()));
这用于吸引所有孩子。现在,如果我想添加一个新的孩子,我会得到它的phoneNumber并检查以下条件。如果此列表的大小等于零,则表示我可以添加子项,但如果它大于零则表示此子项存在:
childQuery.where(ChildDao.Properties.PhoneNumber.eq(phoneNumber)).list().size()
请注意,phoneNumber是新的子phoneNumber。
但我的问题是,当我通过第一个查询得到子List时,它的大小是10,这在我的情况下是完全正确的,然后当我用第二个代码检查条件时,突然,childQuery的大小变为1或0。 (取决于新孩子的电话号码是否存在于DB中。) 这正是我所写的:
QueryBuilder<Child> childQuery = childDao().queryBuilder()
.where(ChildeDao.Properties.UserId.eq(child.getUserId()));
for(int i = 0; i < newChildrenList.size(); i++)
{
String phoneNumber = newChildrenList.get(i).getPhoneNumber();
if(childQuery.where(ChildDao.Properties.PhoneNumber.eq(phoneNumber)).list().size()==0){
addChildToDB();
}
}
所以我的问题是我不知道上面的代码有什么问题。为什么childQuery会受到哪些条件的影响?我应该如何防止其发生变化?
答案 0 :(得分:1)
据我所知,greenDao的功能是动态地向现有QueryBuilder
添加条件(Where())。
因此,当您检查childQuery.where(ChildDao.Properties.PhoneNumber.eq(phoneNumber))
时,它会为原始查询添加条件。
防止它的一种方法是在循环中创建一个新变量:
for(...){
QueryBuilder<Child> child = childQuery;
if(child.where(ChildDao.Properties..PhoneNumber.eq(phoneNumber)).list().size()==0){
addChildToDB();
}
}
或者您也可以将childQuery放入其中:
if(childDao().queryBuilder()
.where(ChildeDao.Properties.UserId.eq(child.getUserId()),
ChildDao.Properties.PhoneNumber.eq(phoneNumber))
.list().size() == 0){
addChildToDB();
}