Передающий двоичный блоб через контент-провайдера

У меня есть контент-провайдер, который является пользовательским к моему набору приложений 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 контент-провайдера.

8
задан Charles 13 March 2013 в 06:38
поделиться

1 ответ

Вы не сможете использовать MatrixCursor для отправки массива байтов. Это связано с тем, что это зависит от метода AbstractCursor # fillWindow , который заполняет CursorWindow , используя Object # toString . Итак, что происходит, так это то, что вызывается метод массива байтов toString , и он сохраняет его вместо содержимого массива байтов, которое вы хотите. Единственный способ обойти это, что я вижу, - это реализовать свой собственный Cursor, который будет заполнять CursorWindow соответствующим образом для байтового массива.

4
ответ дан 5 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: