2013-11-04 9 views
6

Nella mia applicazione ho una relazione progettata in questo modo: relationship description e sto provando a selezionare tutte le chat che hanno almeno un utente come amico.Domande deepDao profonde con n: m relazioni

sostanza, voglio per eseguire questa query:

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 

io non sono riuscito a trovare un modo per eseguire questo nelle biblioteche GreenDao e speravo che qualcuno sarà in grado di aiutarmi con questo.

EDIT:
Questo è ciò che ho fino ad ora:

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

risposta

2

Dato grrendao non implementa QueryBuilder.join() -metodi in questo momento, credo che la soluzione è uno dei migliori che si può essere in questo momento, poiché usa internamente join.

ci sono svantaggi solo minori ad esso:

  • si potenzialmente di query più tabelle di quelli necessari
  • si deve scorrere un potenzialmente elevato lista
  • non è possibile utilizzare listLazy()

Un altro modo sarebbe utilizzare alcune query come questa (presumibilmente IsFriend è una misura int-column e myType s per 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); 

Or (probabilmente meno performante):

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

Quindi è possibile utilizzare i desiderati list() -metodi:

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

penso 'T' è già adottate dalla il 'QueryBuilder' – thepoosh

+0

Questo è giusto e usarlo è apposta. 'queryRawCreate()' costruisce una query come questa 'SELECT T. * FROM YourTable T'. Quindi puoi estendere la clausola 'FROM' e aggiungere una clausola' where'. – AlexS

+0

oh, ok ... l'ho provato e ho fallito. riproverò presto – thepoosh

Problemi correlati