Сохранение файла в базе данных Android (пользовательский поставщик контента) с использованием поля _data - v1.6

Я боролся с проблемой в моем приложении для Android. Я читал документацию по Android, свою книгу по Android (Andriod Pro 2) и просматривал почти каждый пример, который мог достать, но не мог понять, как реализовать хранение файлов (изображений, двоичных данных). ) против записей в таблице Sqlite, предоставленной поставщиком контента .

Вот что я сделал (почти аналогично образцу приложения Notepad):

  • В моем провайдере реализован ContentProvider . Все это работает для операций CRUD. Внутри он использует реализацию SQLiteOpenHelper (довольно стандартный материал)
  • Я добавил столбец _data типа текста
  • Я вставляю запись и получаю обратно Uri
  • Вызовите openOutputStream у поставщика контента и начните записывать данные

Это в точности соответствует книге Android Pro 2. Вот фрагмент этой части кода:

Uri uri = getContentResolver().insert(MyAuthority.CONTENT_URI, contentValues);
OutputStream s = getContentResolver().openOutputStream(uri);

Но я получаю сообщение об ошибке ниже:

11- 29 01: 07: 30.717: ПРЕДУПРЕЖДЕНИЕ / System.err (1490): java.io.FileNotFoundException: Нет файлы, поддерживаемые провайдером на content: // myproviderauthority / podcasts / 1

Что мне нужно делать? Я читал документацию по Android , но она очень расплывчата:

поле, которое предоставляет данные для клиенты должны фактически содержать content: строка URI.

1) Итак, должен ли тип поля быть TEXT или существует специальный тип данных content: URI string ?

2) Во время вставки я не есть URI. Нужно ли мне получать URI после вставки, а затем обновлять это поле в записи?

В записи также должен быть другой поле с именем "_data", в котором перечислены точный путь к файлу на устройстве для этого файл. Это поле не предназначено для читается клиентом, но ContentResolver.

3) Итак, каким должен быть тип этого поля? ТЕКСТ - Я полагаю?

Клиент позвонит ContentResolver.openInputStream () в обращенное к пользователю поле, содержащее URI за товар.

4) Это чушь полнейшая! Как я могу вызвать ContentResolver.openInputStream () в поле ?? Вы можете назвать это только официально и передать Uri.

Спасибо за ваше время, и я надеюсь, что вы можете мне помочь. Я также рассмотрел эти вопросы SO ( this и this ), и они не помогли.

Между прочим, я использую API уровня 4 (версия 1.6).

7
задан Community 23 May 2017 в 10:29
поделиться