QueryBuilder上的条件greenDao android

时间:2016-05-09 06:20:55

标签: android query-builder greendao

我是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会受到哪些条件的影响?我应该如何防止其发生变化?

1 个答案:

答案 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();
}