Как выбрать pdf файл из документа, сохранить его в SQLite и снова открыть его из SQLite? - PullRequest
0 голосов
/ 05 мая 2018

Я хочу выбрать файл .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-объекта. Теперь, как я могу получить и открыть его. Пожалуйста, помогите мне

1 Ответ

0 голосов
/ 05 мая 2018

код onActivityResult

A Uri - это не файл. Только если схема Uri равна file, ваш код работает. Замените ваш FileInputStream на InputStream, где вы получите InputStream от getContentResolver().openInputStream(data.getData()).

Также:

  • Ваше приложение будет часто зависать, так как у вас не будет достаточно памяти для хранения PDF

  • Сохранение больших файлов в столбцах BLOB - это анти-паттерн в Android, так как используемые нами API-интерфейсы SQLite не очень хорошо обрабатывают большое содержимое

  • Пользователь не будет доволен вами, поскольку вы выполняете этот дисковый ввод-вывод в главном потоке приложения, в результате чего пользовательский интерфейс вашего приложения останавливается во время выполнения этого ввода-вывода

Теперь, как я могу получить и открыть его

Обратный процесс:

  • Получить byte[] из базы данных

  • Сохранить это byte[] в файл

  • Используйте ACTION_VIEW и FileProvider.getUriForFile(), чтобы открыть файл в выбранной пользователем программе просмотра PDF

Еще раз:

  • Ваше приложение будет часто зависать из-за нехватки памяти при попытке загрузить большой BLOB

  • Выполните ввод / вывод в фоновом потоке, чтобы не заморозить интерфейс

  • Хранение больших BLOB значений - это анти-паттерн в Android

Я настоятельно рекомендую вам не хранить PDF как BLOB в базе данных. Или:

  • Используйте ACTION_OPEN_DOCUMENT и takePersistableUriPermission() вместо ACTION_GET_CONTENT и сохраните Uri в базе данных или

  • Скопируйте PDF в файл и сохраните некоторый идентификатор файла в базе данных

...