Java 如何从文档中选取pdf文件,将其存储在SQLite中,然后再次从SQLite中打开它?

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

我想从移动内部存储中选取.pdf文件,将该文件保存在sqlite中,作为blob类型。当我点击“查看”按钮,然后从数据库中检索它,并在支持pdf的应用程序中打开它

这里我使用这个代码来选择文件

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中,在
    BLOB
    列中保存大型文件是一种反模式,因为我们使用的SQLite API不能很好地处理大型内容

  • 用户不会对您感到满意,因为您正在主应用程序线程上执行此磁盘I/O,导致在执行I/O时应用程序的UI冻结

现在我如何检索和打开它

颠倒过程:

  • 从数据库中获取
    字节[]

  • 将该
    字节[]
    保存到文件中

  • 使用
    ACTION\u VIEW
    FileProvider.getUriForFile()
    在用户选择的PDF查看器中打开文件

再次:

  • 你的应用程序会崩溃很多,因为试图加载一个大的
    BLOB

  • 在后台线程上执行I/O,以免冻结UI

  • 在Android中,存储大的
    BLOB
    值是一种反模式

我强烈建议您不要将PDF作为
BLOB
存储在数据库中。要么:

  • 使用
    ACTION\u OPEN\u DOCUMENT
    takePersistableUriPermission()
    而不是
    ACTION\u GET\u CONTENT
    ,并将
    Uri
    保存在数据库中,或

  • 将PDF复制到文件中,并将文件的某些标识符存储在数据库中


谢谢您的回答,如果我将Uri保存在数据库中,当我从存储中删除原始文件时,它会是什么样子open@Jayashri:那不行。如果这是一个“导入”操作——您希望自己独立于原始内容的内容副本——您需要制作一个副本。尽管我建议您将该副本制作为文件,而不是
BLOB
。保存
Uri
比复制数据要快,它允许用户通过其他工具编辑该内容,但它确实存在用户删除
Uri
标识的内容的风险。