【问题标题】:How to pick pdf file from document , store it in SQLite and again open it from SQLite?如何从文档中选择 pdf 文件,将其存储在 SQLite 中并再次从 SQLite 打开它?
【发布时间】:2018-05-05 12:49:32
【问题描述】:

我想从移动内部存储中选择 .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 类型保存到数据库中。现在我该如何检索和打开它。请帮帮我

【问题讨论】:

    标签: java android sqlite file-handling


    【解决方案1】:

    onActivityResult 代码

    Uri 不是文件。只有当Uri 的方案是file 时,您的代码才能工作。将您的FileInputStream 替换为InputStream,您可以从getContentResolver().openInputStream(data.getData()) 获得InputStream

    还有:

    • 您的应用会经常崩溃,因为您没有足够的内存来保存 PDF

    • BLOB 列中保存大文件是 Android 中的一种反模式,因为我们使用的 SQLite API 不能很好地处理大内容

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

    现在我该如何检索和打开它

    逆向处理:

    • 从数据库中获取byte[]

    • byte[] 保存到文件中

    • 使用ACTION_VIEWFileProvider.getUriForFile() 在用户选择的PDF 查看器中打开文件

    再一次:

    • 你的应用会经常崩溃,因为尝试加载一个大的BLOB时内存不足

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

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

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

    • 使用ACTION_OPEN_DOCUMENTtakePersistableUriPermission()代替ACTION_GET_CONTENT,并将Uri保存在数据库中,或者

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

    【讨论】:

    • 感谢您的回答,如果我将 Uri 保存在数据库中,当我从存储中删除原始文件时,它将如何打开
    • @Jayashri:那行不通。如果这是一个“导入”操作——您想要自己的独立内容副本,与原始内容分开——您需要制作一个副本。虽然我建议您将该副本制作为文件,而不是 BLOB。保存Uri 比复制数据更快,它允许用户通过其他工具编辑该内容,但它确实存在用户删除Uri 标识的内容的风险。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2021-08-20
    • 2013-09-25
    • 1970-01-01
    • 2011-03-17
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多