2013-11-04 18 views
6

私のアプリケーションには、次のような関係があります。 relationship description 私は少なくとも1人のユーザーを友人として持つすべてのチャットを選択しようとしています。私はGreenDaoライブラリでこれを実行するための方法を見つけるために管理していないと誰かがこれで私を助けることができるようになります期待していたn:mの関係を持つGreenDaoディープクエリー

SELECT c.* FROM CHAT c, USER u, UserChats uc 
    WHERE c.type = myType 
    AND u.isFriend = 1 
    AND c.id = uc.chatId 
    AND u.id = uc.userId 

は基本的に、私はこのクエリを実行します。

EDIT:
これは私が今まで持っているものです:grrendaoは、現時点ではQueryBuilder.join() -methodsを実装していないので

List<UsersChats> list = usersChatsDao.queryDeep(
    "WHERE T0." + UserDao.Properties.isFriend.collumnName + " = ? "+ 
    "AND T1." + ChatDao.Properties.type.collumName + " = ?", 
    new String[] {"1", myType}); 

if(list != null && list.isEmpty() == false) { 
    List<Chat> chats = new ArrayList<Chat>(); 
    for(UsersChats link : list) { 
     chats.add(link.getChat()); 
    } 
} 

答えて

2

、私はあなたのソリューションは、あなたの最高の一つだと思います内部的に結合を使用するので、今すぐ取得できます。

は、それだけにマイナーな欠点があります。

  • あなたが潜在的にクエリあなたが潜在的に大きなリストを反復処理する必要がありますが、実際に
  • を必要以上のテーブルが
  • あなたが使用することはできませんlistLazy()

もう1つの方法は、このようなクエリを使用することです(IsFriendint-columnとなり、myTypeフィットあなたが希望list() -methods使用することができます

Query<Chat> qc = chatDao.queryRawCreate(
     " , "+UserChatsDao.TABLENAME+" UC"+ 
     " , "+UserDao.TABLENAME+" U"+ 
     " WHERE T."+ChatDao.Properties.type.columnName+"=?"+ 
     " AND U."+UserDao.Properties.isFriend.columnName+"=?"+ 
     " AND T."+ChatDao.Properties.id.columnName+"=UC."+UserChats.Properties.chatId.columnName+ 
     " AND U."UserDao.Properties.id.columnName+"=UC."+UserChats.Properties.userId.columnName, myType, 1); 

その後:ChatDao.Properties.type秒:

Query<Chat> qc = chatDao.queryRawCreate(
     " LEFT JOIN "+UserChatsDao.TABLENAME+" UC"+ 
     " ON T."+ChatDao.Properties.id.columnName+"=UC."+UserChats.Properties.chatId.columnName+ 
     " LEFT JOIN "+UserDao.TABLENAME+" U"+ 
     " ON UC."+UserChats.Properties.userId.columnName+"=U."UserDao.Properties.id.columnName+ 
     " WHERE U."UserDao.Properties.isFriend.columnName+"=?"+ 
     " AND T."+ChatDao.Properties.type.columnName+"=?", 1, myType); 

か(おそらくあまりパフォーマンスは)

qc.list(); 
qc.listLazy(); 
... 
+0

を私は 'T'がすでにによって取られると思います'QueryBuilder' – thepoosh

+0

これは正しいことです。 'queryRawCreate()'は 'SELECT T. * FROM YourTable T'のようなクエリを作成します。したがって、 'FROM'節を拡張して' where'節を追加することができます。 – AlexS

+0

ああ、ok ...私はそれを試して失敗しました。すぐに再試行します – thepoosh

関連する問題