У меня есть контент-провайдер, который является пользовательским к моему набору приложений Android, и одной из вещей, которые он должен выставить, является маленький массив байтов (на 20-30 кибибайт). URI для этих блобов похож:
content://my.authority/blob/#
где #
номер строки; получающийся курсор имеет стандарт _id
столбец и столбец данных. Я использую a 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
, расчет, что это могло бы искать это начиная с подсистемы контент-провайдера, был записан для EA с SQLite, но это не помогло.
Кто-либо заставил это работать? Если данные были в файловой системе, существуют методы в ContentProvider
то, что я мог использовать для обеспечения упорядоченного InputStream
клиенту, но данным я пытаюсь передать жизни обратно как ресурс в APK контент-провайдера.
Вы не сможете использовать MatrixCursor
для отправки массива байтов. Это связано с тем, что это зависит от метода AbstractCursor # fillWindow
, который заполняет CursorWindow
, используя Object # toString
. Итак, что происходит, так это то, что вызывается метод массива байтов toString
, и он сохраняет его вместо содержимого массива байтов, которое вы хотите. Единственный способ обойти это, что я вижу, - это реализовать свой собственный Cursor, который будет заполнять CursorWindow
соответствующим образом для байтового массива.