2016-05-09 18 views
0

私はアンドロイドで新しく、greenDao ORMを学習してテストプロジェクトで使用することに決めました。where QueryBuilder on condition greenDao android

私はUserオブジェクトのリストを作成しています。各ユーザは複数の子を持つことができます。だから私は、ユーザーの子供を見つけることができるように子オブジェクト内のuserIdを保持します。

各子供には電話番号があります。これらの電話番号は一意です。だから、私は子供の電話番号がテーブルに存在してはならないことを確認する必要がありますユーザーのために子供を挿入する場合。

これを行うために、データベースからすべての子オブジェクトを取得するQueryBuilderを作成しました。 QueryBuilder<Child> childQuery = childDao().queryBuilder() .where(ChildeDao.Properties.UserId.eq(child.getUserId()));

これはすべての子供を取得するために使用されます。私は新しい子供を追加したい場合、私はそのphoneNumberを取得し、以下の条件をチェックします。このリストのサイズがゼロに等しい場合、それは私が子供を追加することができることを意味しますが、それはゼロよりも大きい場合には、この子が存在することを意味しますにphoneNumberは新しい子にphoneNumberであることを

childQuery.where(ChildDao.Properties.PhoneNumber.eq(phoneNumber)).list().size() 

は注意してください。

しかし私の問題は、最初のクエリで子リストを取得すると、そのサイズが10であり、私の場合は正確であり、次に2番目のコードで条件をチェックすると、突然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

私が知っている限り、条件(Where())を動的にQueryBuilderに追加するのはgreenDaoの機能です。

したがって、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(); 
} 
+0

感謝を。パフォーマンスのためにどちらが良いですか? – TTS

+0

'QueryBuilder'に' .where() 'を追加すると' List 'にのみパラメータが追加されます。 '.list()'を呼び出すまでクエリ自体は実行されません。私は両者の違いは重要ではないと思う。 –

+0

FYIでは、フェッチされたデータにアクセスする必要がない場合は、 '.list()。size()'の代わりに '.count()'を使用できます。 –