Android的SQLiteStatement中的函数simpleQueryForBlobFileDescriptor()对我来说还是个谜。而且似乎没有人在任何地方使用它。似乎这将是用于单个Blob访问的快速方法,并且就性能而言(如果可以相信该文档),当用于将Blob数据从db流出时,SQLiteStatement和Parcel的组合应该会产生非常快速的结果。 。我不知道,因为我无法使事情正常进行,因此我可以进行测试...对此提供的任何帮助或见解将不胜感激:

SQLiteStatement get = mDb.compileStatement(
    "SELECT blobColumn" +
    " FROM tableName" +
    " WHERE _id = 1" +
    " LIMIT 1"
);

ParcelFileDescriptor result = get.simpleQueryForBlobFileDescriptor();
// now what?


我可能应该注意到我正在使用并且只真正在乎Honeycomb(3.2),并在此先感谢您的见解。

最佳答案

SQLiteStatement get = mDb.compileStatement(
    "SELECT blobColumn" +
    " FROM tableName" +
    " WHERE _id = 1" +
    " LIMIT 1"
);

ParcelFileDescriptor result = get.simpleQueryForBlobFileDescriptor();
FileInputStream fis = new FileInputStream(result.getFileDescriptor()); // read like any other


并且我可以验证这对于我的用例来说非常快。

我发现这特别有用(如果您需要像我一样创建自己的自定义脱机Webview文件缓存)是在内容提供者的openFile覆盖中,您可以直接返回描述符(或者理想情况下覆盖openTypedAssetFile())

例子:
files是一个数据库帮助器,并且getFileDescriptor(String)与上面的代码相似

public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, android.os.Bundle opts) throws FileNotFoundException {
    ParcelFileDescriptor pfd = files.getFileDescriptor(uri.toString());
    if (pfd != null) {
        return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH);
    }
    return null;
}


或类似问题的另一个很好的用法:
(您要在其中将自定义文件从数据库提供到Webview)

private WebViewClient webViewClient = new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

        ParcelFileDescriptor pfd = files.getFileDescriptor(url);
        if (pfd != null) {
            return new WebResourceResponse(null, null, new FileInputStream(pfd.getFileDescriptor()));
        }

        return null;
    }

09-26 09:04