Android GreenDao 深查询 n:m 的关系
Posted 星辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android GreenDao 深查询 n:m 的关系相关的知识,希望对你有一定的参考价值。
在我的应用程序这样设计的关系:和我想选择至少一个用户作为一个朋友的所有聊天。
基本上,我想要执行以下查询:\
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()
另一种方法是使用一些像这样的查询 (假定 IsFriend
是 int-column
和 myType
适合到 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 的关系的主要内容,如果未能解决你的问题,请参考以下文章
Android:安卓学习笔记之GreenDao 的简单理解和使用
Android Sqlite框架 GreenDao的源码分析笔记