Проблема с viewbinder simplecursortreeadapter-не удается преобразовать строку в blob-объект
У меня есть картинки в моей предварительно заполненной базе данных sqlite, я использую Simplecursortreeadapter для передачи данных в exepndablelistview , но приложение давит при открытии childview с картинкой, а в logcat я получил "не удается преобразовать строку в BLLOB".
Проведя некоторые исследования в Интернете, я обнаружил(возможно), что мне нужно реализовать viewbinder, что я и сделал ( скопировать прошлое и добавить его в свои столбцы) ..то, что я сделал, основано на ответе на этот вопрос question:https://stackoverflow.com/questions/30388843/unable-to-convert-blob-to-string-using-loadermanager-in-андроид ..
Но приложение не может построить успешно сейчас...я думаю, что мне что-то не хватает или что-то не так с моим кодом:
Пожалуйста, помогите! спасибо
public class MainActivity extends AppCompatActivity { ExpandableListView expandableListView; Database mDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDatabase = new Database(this); mDatabase.open(); SimpleCursorTreeAdapter.setViewBinder( new MyViewBinder()); Cursor cursor = mDatabase.getDatabase(); startManagingCursor(cursor); String[] childFrom = new String[]{Database.DATABASE_CHILD_1,Database.DATABASE_CHILD_2}; String[] groupFrom = new String[]{Database.DATABASE_GROUP_1}; int[] groupTo = {R.id.group1}; int[] childTo = {R.id.child1,R.id.child2}; SimpleCursorTreeAdapter simplecursortreeAdapter = new ExpandableListViewAdapter( this, cursor, R.layout.list_group, groupFrom, groupTo, R.layout.list_child, childFrom, childTo ); expandableListView = findViewById(R.id.expandableListview); expandableListView.setAdapter(simplecursortreeAdapter); } protected void onDestroy() { super.onDestroy(); mDatabase.close(); } public class MyViewBinder implements ViewBinder { @Override public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewID = view.getId(); switch(viewID){ case R.id.child1 : TextView friendName = (TextView) view; String friend_name; friend_name = cursor.getString(cursor.getColumnIndex(Database.DATABASE_CHILD_1)); friendName.setText(friend_name); break; case R.id.child2 : ImageView contactProfile = (ImageView) view; byte[] imageBytes = cursor.getBlob(cursor.getColumnIndex(Database.DATABASE_CHILD_2)); if(imageBytes != null ){ // Pic image from database contactProfile.setImageBitmap(BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length)); }else { // If image not found in database , assign a default image contactProfile.setBackgroundResource(R.drawable.disorders); } break; } return true; } } private class ExpandableListViewAdapter extends SimpleCursorTreeAdapter { private ExpandableListViewAdapter( Context context, Cursor cursor, int groupLayout, String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom, int[] childTo) { super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo); } protected Cursor getChildrenCursor(Cursor groupCursor) { return mDatabase.getID(groupCursor.getInt(groupCursor.getColumnIndex(Database.DATABASE_ID))); } } }
Что я уже пробовал:
я пробовал что вы видели в коде
Richard MacCutchan
Изображение (или большой двоичный объект) не является строкой и не должно быть преобразовано в нее. Вы должны хранить данные изображения непосредственно в виде большого двоичного объекта (Binary Large Object), ключевым словом которого является binary: это просто массив байтов.
David Crow
В вашем ExpandableListViewAdapter
класс, вам нужно переопределить setViewValue()
и проверьте, чтобы увидеть, если просмотреть привязки заключается в том, что ваши ImageView
виджет, что-то вроде:
@Override public boolean setViewValue( View view, Cursor cursor, int columnIndex ) { if (view.getId() == id_of_image) { try { byte[] icon = cursor.getBlob(columnIndex); ImageView image = (ImageView) view; image.setImageBitmap(…); return true; } catch (Exception e) { Log.e(TAG, e.getMessage()); } } return false; }