• Android GreenDao 深查询 n:m 的关系


    在我的应用程序这样设计的关系:relationship description和我想选择至少一个用户作为一个朋友的所有聊天。

    基本上,我想要执行以下查询:

    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();
    ...
  • 相关阅读:
    acm的STL容器之vector篇
    服务器远程管理方法及centos该装那个
    VB获取对象成员
    获取搜索引擎关键字建议
    IntelliJ IDEA乱码 问题
    排序算法思想
    ubuntu16 开机启动plank
    fail-fast出识
    html 标签过滤、转译、反转译
    (a ==1 && a== 2 && a==3) 有可能是 true 吗?
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9005058.html
Copyright © 2020-2023  润新知