2013-11-04 19 views
6

benim uygulamada böyle tasarlanmış bir ilişki var: relationship description ve arkadaş olarak en az bir kullanıcı olan tüm sohbetleri seçmek çalışıyorum. Ben GreenDao kütüphanelerinde bu yürütmek için bir yol bulmak için yönetilen değil ve kimse bu konuda bana yardımcı mümkün olacak umuyordumGreenDao derin sorgular: m ilişkileri

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 

:

temelde, bu sorguyu yürütmek istiyoruz.

DÜZENLEME:
Bu ben ne var şu: grrendao anda QueryBuilder.join() -Kullanılan uygulamıyor yana

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

cevap

2

, senin çözüm en iyilerinden biri olduğunu düşünüyorum Eğer şu anda alabilir, çünkü dahili olarak birleştirir.

kendisine sadece küçük dezavantajları vardır:

  • potansiyel sorgusu, potansiyel olarak büyük bir listeyi yinelemek zorunda aslında
  • gerekenden daha fazla tablo
  • sen kullanamazsınız listLazy()

Başka bir yol, bu gibi bazı sorguları kullanmak olabilir (varsayılanint-column ve myType formudur ChatDao.Properties.type için s: (muhtemelen yeterli performansı)

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

Veya:

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

't' zaten tarafından alınır: Sonra

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

istenen list() -Kullanılan kullanabilirsiniz "QueryBuilder" – thepoosh

+0

Bu doğru ve bunu kullanmak amaçlıdır. 'queryRawCreate()', bu gibi bir sorgu oluşturur SEL SELECT T. * FROM YourTable T'. Böylece 'FROM' cümleciğini uzatabilir ve '' '' '' fıkra '' ekleyebilirsiniz. – AlexS

+0

oh, tamam ... Denedim ve başarısız oldum. yakında tekrar deneyeceğim – thepoosh