Невозможно конвертировать BLOB в строку, используя Loadermanager в Android

У меня есть таблица со следующей структурой.

    public static final String TABLE_NAME = "contact";
    public static final String ID = "_id";
    public static final String DEVICE_ID = "device_id";
    public static final String NAME = "name";
    public static final String CONTACT = "contact";
    public static final String IMAGE = "image";

    private static final int VERSION = 1;

    private static final String CREATE_TABLE_QUERY = "CREATE TABLE "
            + TABLE_NAME + "( " + ID + " INTEGER PRIMARY KEY , " + DEVICE_ID
            + " TEXT NOT NULL ,  " + NAME + "  TEXT NOT NULL , " + CONTACT
            + " TEXT NOT NULL ," 
            + IMAGE + "  BLOB " + 
            " ) ";

Я сохранил изображения в контактной таблице в BLOB-форме. Теперь мне нужно извлечь device_id, имя, изображение из таблицы и прикрепить результат к просмотру.

Я использовал Loadermanager для этого.

    Открытый класс FriendList расширяет Activity реализует OnItemClickListener,
            LoaderManager.LoaderCallbacks {
        ListView friendList;
        SimpleCursorAdapter simpleCursorAdapter;
        CursorLoader cursorLoader;
        LoaderManager.LoaderCallbacks loaderCallback;
        static final int CONTACT_LOADER_ID = 77;

        @Override
        protected void onCreate (BundlevedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.friend_list);
            friendList = (ListView) findViewById(R.id.lvFriendList);
            String[] uiBindFrom = new String[] { MyContacts.NAME,
                    MyContacts.DEVICE_ID,MyContacts.IMAGE};
            int[] idBindTo = { R.id.tvFriendName, R.id.tvDeviceID,R.id.ivContactProfile};
            loaderCallback = это;
            simpleCursorAdapter = new SimpleCursorAdapter(FriendList.this,
                    R.layout.custom_friend_list, null, uiBindFrom, idBindTo, 0);
            friendList.setAdapter(simpleCursorAdapter);
            friendList.setOnItemClickListener(это);
            getLoaderManager().initLoader(CONTACT_LOADER_ID, новый Bundle(),
                    loaderCallback);
        }

Здесь R.id.ivContactProfile является идентификатором ImageView.

    @Override
    public Loader onCreateLoader (int id, Bundle args) {
        String [] projectionFields = new String [] {MyContacts.ID,
                MyContacts.NAME, MyContacts.DEVICE_ID, MyContacts.IMAGE};
        cursorLoader = новый CursorLoader(FriendList.this,
                MyContacts.CONTENT_URI, projectionFields, null, null, null);
        вернуть cursorLoader;
    }

    @Override
    public void onLoadFinished (загрузчик загрузчика, курсор курсора) {
        switch (loader.getId()) {
        case CONTACT_LOADER_ID:
            simpleCursorAdapter.swapCursor(курсор);
            перерыв;
        }

    }

В основном у меня есть изображения, сохраненные в таблице в форме byte[], и я должен прикрепить данные к представлению, но это возвращает мне исключение, подобное этому.

05-21 19:30:05.169: E/AndroidRuntime(22609): android.database.sqlite.SQLiteException: неизвестная ошибка: невозможно преобразовать BLOB в строку

Вот полный журнал для этого.

05-21 19: 30: 05.169: E / AndroidRuntime (22609): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное
05-21 19:30:05.169: E/AndroidRuntime(22609): android.database.sqlite.SQLiteException: неизвестная ошибка: невозможно преобразовать BLOB в строку
05-21 19: 30: 05.169: E / AndroidRuntime (22609): в android.database.CursorWindow.nativeGetString(собственный метод)
05-21 19:30:05.169: E/AndroidRuntime(22609): в android.database.CursorWindow.getString(CursorWindow.java:450)
05-21 19:30:05.169: E/AndroidRuntime(22609): в android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
05-21 19:30:05.169: E/AndroidRuntime(22609): в android.database.CursorWrapper.getString(CursorWrapper.java:114)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.support.v4.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:135)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.AbsListView.obtainView(AbsListView.java:2452)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.ListView.measureHeightOfChildren(ListView.java:1250)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.ListView.onMeasure(ListView.java:1161)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.View.measure(View.java:12865)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.View.measure(View.java:12865)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.View.measure(View.java:12865)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.LinearLayout.measureVertical(LinearLayout.java:822)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.View.measure(View.java:12865)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
05-21 19:30:05.169: E/AndroidRuntime(22609): на com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2242)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.View.measure(View.java:12865)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1240)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.os.Handler.dispatchMessage(Handler.java:99)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.os.Looper.loop(Looper.java:137)
05-21 19:30:05.169: E/AndroidRuntime(22609): на android.app.ActivityThread.main(ActivityThread.java:4517)
05-21 19:30:05.169: E/AndroidRuntime(22609): в java.lang.reflect.Method.invokeNative(собственный метод)
05-21 19:30:05.169: E/AndroidRuntime(22609): в java.lang.reflect.Method.invoke(Method.java:511)
05-21 19:30:05.169: E/AndroidRuntime(22609): на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
05-21 19:30:05.169: E/AndroidRuntime(22609): на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
05-21 19:30:05.169: E/AndroidRuntime(22609): в dalvik.system.NativeStart.main(собственный метод)

Может кто-нибудь сказать мне, почему я получаю это исключение и как я могу решить эту проблему?

Спасибо!

1 ответ

Решение

Я нашел решение своей проблемы. Как предложил @pskink в своем комментарии выше, я использовал ViewBinder, Я создал ViewBinder, как это.

public class MyViewBinder implements ViewBinder{
    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        int viewID = view.getId();
        switch(viewID){

        case R.id.tvFriendName :
            TextView friendName = (TextView) view;
            String friend_name;
            friend_name = cursor.getString(cursor.getColumnIndex(MyContacts.NAME));
            friendName.setText(friend_name);
            break;

        case R.id.tvDeviceID :
            TextView deviceID = (TextView) view;
            String device_id = cursor.getString(cursor.getColumnIndex(MyContacts.DEVICE_ID));
            deviceID.setText(device_id);
            break;

        case R.id.ivContactProfile :
            ImageView contactProfile = (ImageView) view;
            byte[] imageBytes = cursor.getBlob(cursor.getColumnIndex(MyContacts.IMAGE));
            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.bubble_a);
            }
            break;
        }
        return true;
    }


}

И я установил ViewBinder для моего SimpleCursorAdapter.

simpleCursorAdapter.setViewBinder (new MyViewBinder ());

У меня это сработало правильно. Вот выход.

введите описание изображения здесь

Другие вопросы по тегам