安卓通用图片加载器能够处理来自SQLite数据库的图片吗?

12

我希望将我的图像以blob格式存储在sqlite数据库中,可能还要对它们进行加密。 是否可以使用Android-Universal-Image-Loader从sqlite数据库加载图像?


你试过使用它吗? - user
我现在正在使用它从文件系统中加载图像。我在文档或源代码中没有看到任何接受byte[]作为输入的方法。当我从数据库加载位图时,会返回一个byte[]。 - Tamas
1个回答

21

UIL默认情况下不支持从SQLite数据库中获取图像。但是您可以自己添加此功能,只需想出新的方案/协议名称(例如db://),实现自己的ImageDownloader并将其设置到配置中。

例如:

让我们选择自己的方案db,这样我们的URI将看起来像"db://..."

然后实现ImageDownloader。我们应该捕获包含我们方案的URI,解析它,在数据库中查找所需数据并为其创建InputStream(它可以是ByteArrayInputStream)。

public class SqliteImageDownloader extends BaseImageDownloader {

    private static final String SCHEME_DB = "db";
    private static final String DB_URI_PREFIX = SCHEME_DB + "://";

    public SqliteImageDownloader(Context context) {
        super(context);
    }

    @Override
    protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
        if (imageUri.startsWith(DB_URI_PREFIX)) {
            String path = imageUri.substring(DB_URI_PREFIX.length());

            // Your logic to retreive needed data from DB
            byte[] imageData = ...;

            return new ByteArrayInputStream(imageData);
        } else {
            return super.getStreamFromOtherSource(imageUri, extra);
        }
    }
}

然后我们将这个ImageLoader配置:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
        ...
        .imageDownloader(new SqliteImageDownloader(context))
        .build();

ImageLoader.getInstance().init(config);

然后我们可以采取以下方法从数据库中显示图像:

imageLoader.displayImage("db://mytable/13", imageView);

好的,我刚刚做了这个,它在较弱的手机上运行得很好,例如Galaxy Ace,从数据库加载10K图像需要大约20毫秒。但是当我在Nexus 4或Galaxy S3上运行相同的代码时,加载相同的10k图像需要大约1-3秒钟 :) 有什么想法为什么会出现这种情况吗? - Tamas
澄清一下,我的代码与您粘贴的代码相同,只是需要替换一行:byte[] imageData = db.getImageData(imageId); 在Nexus 4上,db读取大约需要4-10毫秒,但显示图像需要1-3秒。除了imagedownloader设置之外,我在所有地方都使用默认设置。 - Tamas
1
好的,我明白了。我不应该一直打开和关闭数据库,而是在使用时将其保持打开状态,所以你的代码可以正常工作!谢谢! - Tamas
@Tamas 你什么时候关闭数据库?我在 SqliteImageDownloader 构造函数中打开了数据库。 - Dory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接