Member 13930815 Ответов: 0

Проблема с 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;
}

0 Ответов