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;
}