1. 程式人生 > >Android GreenDao 深查詢 n:m 的關系

Android GreenDao 深查詢 n:m 的關系

適合 oid == sta link png getc 可能 圖片

在我的應用程序這樣設計的關系:技術分享圖片和我想選擇至少一個用戶作為一個朋友的所有聊天。

基本上,我想要執行以下查詢:\

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

我沒設法找到了 GreenDao 庫中執行這方式,希望有人能夠幫我這。

編輯:
這是我到現在有:

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

解決方法 1:

因為 grrendao 不會執行 QueryBuilder.join() -目前的方法,我認為您的解決方案是你現在能找到的最好的一個,它在內部使用的聯接。

有只小缺點給它:

  • 您可能會查詢更多的表比你實際需要
  • 你要遍歷一個潛在的巨大的列表
  • 您不能使用listLazy()

另一種方法是使用一些像這樣的查詢 (假定 IsFriendint-columnmyType 適合到 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);

或者 (大概少性能等):

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);

然後您可以使用所需的 list() -方法:

qc.list();
qc.listLazy();
...

Android GreenDao 深查詢 n:m 的關系