У меня есть провайдер контента, настроенный для моего набора приложений Android, и одна из вещей, которую он должен предоставить, - это небольшой (20-30 КиБ) байтовый массив. URI для этих BLOB-объектов выглядит следующим образом:
content://my.authority/blob/#
где #
- номер строки; результирующий курсор имеет стандартный столбец _id
и столбец данных. Я использую MatrixCursor
в методе провайдера query()
:
byte[] byteData = getMyByteData();
MatrixCursor mc = new MatrixCursor(COLUMNS);
mc.addRow(new Object[] { id, byteData });
Позже, в приложении, потребляющем данные, я делаю:
Cursor c = managedQuery(uri, null, null, null, null);
c.moveToFirst();
byte[] data = c.getBlob(c.getColumnIndexOrThrow("data"));
Однако данные не содержат содержимого моего исходного байтового массива; скорее он содержит что-то вроде [B@435cc518
, которое больше похоже на адрес массива, чем на содержимое. Я попытался обернуть байтовый массив в реализацию java.sql.Blob
, полагая, что он может искать это, поскольку подсистема поставщика контента написана так, чтобы ее было легко использовать с SQLite, но это не помогло.
Кто-нибудь заставил это работать? Если бы данные были в файловой системе, в ContentProvider
есть методы, которые я мог бы использовать для предоставления маршаллированному InputStream
клиенту, но данные, которые я пытаюсь отправить обратно, живут как ресурс в APK поставщика контента. .