Java 如何从文档中选取pdf文件,将其存储在SQLite中,然后再次从SQLite中打开它?
我想从移动内部存储中选取.pdf文件,将该文件保存在sqlite中,作为blob类型。当我点击“查看”按钮,然后从数据库中检索它,并在支持pdf的应用程序中打开它 这里我使用这个代码来选择文件Java 如何从文档中选取pdf文件,将其存储在SQLite中,然后再次从SQLite中打开它?,java,android,sqlite,file-handling,Java,Android,Sqlite,File Handling,我想从移动内部存储中选取.pdf文件,将该文件保存在sqlite中,作为blob类型。当我点击“查看”按钮,然后从数据库中检索它,并在支持pdf的应用程序中打开它 这里我使用这个代码来选择文件 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("application/pdf"); intent.addCategory(Intent.CATEG
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/pdf");
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, 100);
onActivityResult代码
Uri fileuri = data.getData();
Log.d(TAG, "Document File Uri = " + fileuri);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis;
try
{
fis = new FileInputStream(new File(fileuri.getPath()));
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
} catch (Exception e) {
e.printStackTrace();
}
byte[] byteFile = baos.toByteArray();
然后,这个byteFile以blob类型保存到数据库中。现在我如何检索和打开它。请帮帮我
onActivityResult代码
Uri fileuri = data.getData();
Log.d(TAG, "Document File Uri = " + fileuri);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis;
try
{
fis = new FileInputStream(new File(fileuri.getPath()));
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
} catch (Exception e) {
e.printStackTrace();
}
byte[] byteFile = baos.toByteArray();
Uri
不是文件。只有当Uri
的方案是file
时,代码才能工作。用InputStream
替换FileInputStream
,从getContentResolver().openInputStream(data.getData())
获取InputStream
此外:
- 你的应用程序会崩溃很多,因为你没有足够的内存来保存PDF
- 在Android中,在
列中保存大型文件是一种反模式,因为我们使用的SQLite API不能很好地处理大型内容BLOB
- 用户不会对您感到满意,因为您正在主应用程序线程上执行此磁盘I/O,导致在执行I/O时应用程序的UI冻结
- 从数据库中获取
字节[]
- 将该
保存到文件中字节[]
- 使用
和ACTION\u VIEW
在用户选择的PDF查看器中打开文件FileProvider.getUriForFile()
- 你的应用程序会崩溃很多,因为试图加载一个大的
BLOB
- 在后台线程上执行I/O,以免冻结UI
- 在Android中,存储大的
值是一种反模式BLOB
BLOB
存储在数据库中。要么:
- 使用
和ACTION\u OPEN\u DOCUMENT
而不是takePersistableUriPermission()
,并将ACTION\u GET\u CONTENT
保存在数据库中,或Uri
- 将PDF复制到文件中,并将文件的某些标识符存储在数据库中
BLOB
。保存Uri
比复制数据要快,它允许用户通过其他工具编辑该内容,但它确实存在用户删除Uri
标识的内容的风险。