Хранение файла в базе данных Android (поставщик нестандартного содержимого) с использованием поля _data - v1.6 - PullRequest
7 голосов
/ 29 ноября 2010

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

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

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

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

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

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

11-29 01: 07: 30.717: WARN / System.err (1490): java.io.FileNotFoundException: нет файлов, поддерживаемых провайдером в содержании: // 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 ( это и это ), и они не помогли.

Кстати, я строю против уровня 4API (версия 1.6).

1 Ответ

3 голосов
/ 02 декабря 2010

Чтобы увидеть, откуда взято «Нет файлов, поддерживаемых провайдером в ...», посмотрите здесь . Ситуация там очень похожа на ту, которую вы описали.

Короче говоря, вашему контент-провайдеру (или некоторым его суперклассам) необходимо переопределить и реализовать метод openFile. Эта ошибка возникает по умолчанию "не реализовано - откат!" код в ContentProvider.java.

Я нахожу полезным заглянуть в исходный код фреймворка, когда я застреваю, поскольку документации иногда немного не хватает.

...