使用CursorLoader查询目录

时间:2013-12-05 21:11:00

标签: android sqlite android-cursorloader

所以这一直让我忙碌。

我正在自定义一个图库,用户可以在其中选择一个或多个图像,我正在使用一个使用CursorLoader的现有项目。几乎每个项目都使用媒体库URI来查询内存中的所有图像。但是,我只想要扫描特定目录并显示图像。

几行代码完全符合我的要求:

final String imagesDirectory = "/storage/sdcard0/DCIM/"
String selection = MediaStore.Images.Media.DATA + " LIKE '" + imagesDirectory + "%'";
cl = new CursorLoader(MultiImageChooserActivity.this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, img.toArray(new String[img.size()]), selection, null, null);

我在SO上找到的这段代码的选择部分,但它也检索子目录中的所有图像,这是我不想要的。一个解决方案可能是检查MediaStore.Images.Media.DATA列是否包含与imagesDirectory相同的斜杠,这应该有效:

imagesDirectory: /storage/sdcard0/DCIM/                   -> 4
/storage/sdcard0/DCIM/photo.jpg                           -> 4, direct child
/storage/sdcard0/DCIM/subdir/otherphoto.jpg               -> 5, in subdir

我发现在SQLite中,这样的查询应该有效(检查/的出现次数):

SELECT LENGTH(col) - LENGTH(REPLACE(col, '/', ''))

其中col应该是MediaStore.Images.Media.DATA,但到目前为止我已经尝试了很多不同的selection变体,但我还没有设法过滤数据。由于您无法提供CursorLoader一个rawQuery(如Cursor),我也无法做到。

我尝试的另一件事是不使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI作为内容URI,而是使用目录中的URI。所以我尝试了这个:

final String imagesDirectory = "/storage/sdcard0/DCIM/"
cl = new CursorLoader(MultiImageChooserActivity.this, 
    Uri.fromFile(new File(imagesDirectory)), 
    img.toArray(new String[img.size()]), null, null, null);

但无济于事。

问题:如何使用CursorLoader查询目录中的所有图像,而不查询其子目录?

我不是SQLite,查询和CursorLoaders的英雄,所以这可能会解释一下。此外,我确实在搜索SO以寻找类似的问题,但在这个特定主题上找不到多少。甚至谷歌搜索directory cursorloader也没有回答任何问题。大多数结果是关于按目录排序的SO帖子......

提前致谢。

1 个答案:

答案 0 :(得分:0)

我设法通过使用扩展条款来解决这个问题:

String where = "_data LIKE '/storage/sdcard0/DCIM/%' AND (SELECT LENGTH(_data) - LENGTH(REPLACE(_data, '/', ''))) = 4";

其中/storage/sdcard0/DCIM/是我的图像目录,4是图像目录名称中的斜杠数量。我在几个不同的目录上尝试了这个(并手动检查它们),它似乎工作正常。

我也会尝试使用pskinks方法(DATA like [dir]/%.jpg and DATA not like [dir]/%/%),并报告结果。