DBFlow的查询问题

ssuper41 2018-10-27 11:13:38
我想根据歌曲的路径path来查询设备里的歌曲。
查询是这样查询的:

即下面的代码:
mListAdapter.mList =SQLite.select().from(MediaItem.class).where(MediaItem_Table.path.greaterThanOrEq(getCurrPathProperty())).queryList();
查出来的size有 134

------------
这个getCurrPathProperty()方法里返回一个路径集合。代码是这样的:



即下面的代码:
Property ppp = PropertyFactory.from(SQLite.select(MediaItem_Table.path).from(MediaItem.class).where(MediaItem_Table.path.like("/storage/8605-11F3" + "%")));
return ppp;
查出来的size是58。 这个是对的。我看了打印,每一条数据的path都是以“/storage/8605-11F3”开头。
-----------
我想问的问题:当把size只有58的getCurrPathProperty()传给第一条查询语句的greaterThanOrEq()查出来有134条数据。
size =58条“/storage/8605-11F3”开始的数据 + 76条“/storage/emulated/0”开头的数据 =134
我想问一下为什么会把“/storage/emulated/0”开头的数据也查出来。
一直想不明白,DBFlow网上关于详细查询的资料比较少,所以找不到答案,所以在这里问一下。希望厉害的人指点一下。
-----------
另外还有一个小疑问:我把greaterThanOrEq()换成in()查出来只有一条数据,这里也想不通为什么...可以的话顺便也指点一下这个
...全文
611 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssuper41 2018-11-12
  • 打赏
  • 举报
回复
引用 3 楼 jklwan 的回复:
[quote=引用 2 楼 aaa27987 的回复:]
你是想多条件查询,直接组合语句就行了,不用这么麻烦,一个for循环

private List<MediaItem> getList(){
        From<MediaItem> from = SQLite.select().from(MediaItem.class);
        int length = mCurrDeviceArray.length;
        if (length == 0){
            return from.queryList();
        }
        Where<MediaItem> where = from.where(MediaItem_Table.path.like(mCurrDeviceArray[0] + "%"));
        for (int i = 1; i < length; i++) {
            where = where.or(MediaItem_Table.path.like(mCurrDeviceArray[i] + "%"));
        }
        return where.queryList();
    }
[/quote] 我试了下你的方法可以实现需求。上次我试了一下,发现下面这个方法也可以达到需求。

  public SQLOperator getCurrPathOperator() {

        if(mCurrDeviceArray.length>0){
            OperatorGroup sqlOperator = OperatorGroup.clause();
            for(int i=0;i<mCurrDeviceArray.length;i++){
                sqlOperator = sqlOperator.or(MediaItem_Table.path.like(mCurrDeviceArray[i] + "%"));
            }
            return sqlOperator;
        }
        return null;
    }
然后查询的时候拼接起来

mList = SQLite.select().from(MediaItem.class).where(getCurrPathOperator()).queryList();
jklwan 2018-11-09
  • 打赏
  • 举报
回复
引用 2 楼 aaa27987 的回复:
你是想多条件查询,直接组合语句就行了,不用这么麻烦,一个for循环

private List<MediaItem> getList(){
        From<MediaItem> from = SQLite.select().from(MediaItem.class);
        int length = mCurrDeviceArray.length;
        if (length == 0){
            return from.queryList();
        }
        Where<MediaItem> where = from.where(MediaItem_Table.path.like(mCurrDeviceArray[0] + "%"));
        for (int i = 1; i < length; i++) {
            where = where.or(MediaItem_Table.path.like(mCurrDeviceArray[i] + "%"));
        }
        return where.queryList();
    }
ssuper41 2018-11-02
  • 打赏
  • 举报
回复
你好,很高兴收到你的解答,你提供的代码可以查到正确的数据。我想实现下面这个查询

String[] mCurrDeviceArray;
SQLite.select().from(MediaItem.class).where(MediaItem_Table.path.like( mCurrDeviceArray).queryList();

我想根据当前选中的路径数组来作为like的条件。然后发现并不能把一个String数组直接当为like的条件。
所以想通过下面的方法来转接一下,这样代码查起来简洁一点。

public Property getCurrPathProperty() {
int length = mCurrDeviceArray.length;
Property ppp;
switch (length) {
case 1:
ppp = PropertyFactory.from(SQLite.select(MediaItem_Table.path).from(MediaItem.class).where(MediaItem_Table.path.like(mCurrDeviceArray[0] + "%")));
break;
case 2:
ppp = PropertyFactory.from(SQLite.select(MediaItem_Table.path).from(MediaItem.class).where(MediaItem_Table.path.like(mCurrDeviceArray[0] + "%")).or(MediaItem_Table.path.like(mCurrDeviceArray[1] + "%")));
break;
case 3:
...;
}
return ppp;
}

然后把getCurrPathProperty()作为greaterThanOrEq或者like的条件,即

mListAdapter.mList = SQLite.select().from(MediaItem.class).where(MediaItem_Table.path.greaterThanOrEq(getCurrPathProperty())).queryList();

----------------------
可能这种方法不可取,我想问一下要实现下面这个查询得怎么修改才合适呢。

String[] mCurrDeviceArray;
SQLite.select().from(MediaItem.class).where(MediaItem_Table.path.like( mCurrDeviceArray).queryList();
jklwan 2018-10-29
  • 打赏
  • 举报
回复
直接用
SQLite.select().from(MediaItem.class).where(MediaItem_Table.path.like("/storage/8605-11F3" + "%")).queryList();
你的getCurrPathProperty方法本身并不会查询数据而是生成了条件,in需要使用数据才有结果,greaterThanOrEq是>=。 使用greaterThanOrEq生成的语句是
SELECT * FROM `media` WHERE `path`>=(SELECT `path` FROM `media` WHERE `path` LIKE '/storage/8605-11F3%') 
因为 / 的ASCII大于 ( 的ASCII所以会返回所以的值。 使用in生成的语句
SELECT * FROM `media` WHERE `path` IN ((SELECT `path` FROM `media` WHERE `path` LIKE '/storage/8605-11F3%')) 
因为in中的数据只有一条,所以会返回第一条匹配的。

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧