【发布时间】:2016-03-02 05:24:29
【问题描述】:
我想将 pdf、word、excel (...) 文件作为 BLOB 数据存储到 sqlite 数据库中,然后检索它以使用第三方应用程序打开。
因为这些文件是机密文件,我不希望它们在阅读时存储在手机中。 (如果手机被偷了,我不希望陌生人访问文件)
我有什么选择?
【问题讨论】:
标签: android sqlite android-studio privacy
我想将 pdf、word、excel (...) 文件作为 BLOB 数据存储到 sqlite 数据库中,然后检索它以使用第三方应用程序打开。
因为这些文件是机密文件,我不希望它们在阅读时存储在手机中。 (如果手机被偷了,我不希望陌生人访问文件)
我有什么选择?
【问题讨论】:
标签: android sqlite android-studio privacy
我不希望它们在阅读时存储在手机中
从技术上讲,您无法控制它。欢迎第三方应用对数据进行任何操作,包括将其保存到文件、通过 Internet 共享等。
欢迎您写一个ContentProvider 流式传输您的文档以响应openFile()。在您的情况下,由于内容不是文件,因此您需要使用ParcelFileDescriptor 管道,因此您可以将数据写入OutputStream。 This sample project 演示了基本技术,尽管我从资产提供 PDF。
不过,如果您在处理较大的文档时遇到问题,我不会感到惊讶。客户端应用程序可能希望在流中向前和向后搜索,而管道不会导致可搜索的流。
【讨论】:
Uri 并使用ContentResolver 和openInputStream() 来读入内容。 “URI 是使用已经存储到特定位置的文件生成的”——为了与其他书籍示例保持一致,我碰巧使用了它。您可以将 Uri 路径设置为您想要的任何路径,只要您知道如何将其映射到所需的数据库条目即可。
openFile()。有很多数据库 ContentProvider 示例,但它们主要用于数据库 API(query()、insert()、update()、delete())。很少有人会走 put-large-docs-in-a-BLOB-column 路线。您可能会考虑使用 IOCipher,而不是滚动您自己的数据库中的加密文档实现。