【问题标题】:Unable to convert BLOB to String using Loadermanager in android无法在 android 中使用 Loadermanager 将 BLOB 转换为字符串
【发布时间】:2015-08-04 00:18:27
【问题描述】:

我有一个具有以下结构的表。

    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、name、image 并将结果附加到视图。

我为此使用了 Loadermanager。

公共类 FriendList 扩展 Activity 实现 OnItemClickListener, LoaderManager.LoaderCallbacks { ListView 好友列表; 简单光标适配器 简单光标适配器; 游标加载器游标加载器; LoaderManager.LoaderCallbacks loaderCallback; 静态最终 int CONTACT_LOADER_ID = 77; @覆盖 protected void onCreate(Bundle savedInstanceState) { 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); 朋友列表.setAdapter(simpleCursorAdapter); 朋友列表.setOnItemClickListener(this); getLoaderManager().initLoader(CONTACT_LOADER_ID, new Bundle(), 加载程序回调); }

这里 R.id.ivContactProfile 是 ImageView 的 id。

@覆盖 公共加载器 onCreateLoader(int id, Bundle args) { String[] projectionFields = new String[] { MyContacts.ID, MyContacts.NAME,MyContacts.DEVICE_ID,MyContacts.IMAGE }; cursorLoader = new CursorLoader(FriendList.this, MyContacts.CONTENT_URI, projectionFields, null, null, null); 返回游标加载器; } @覆盖 public void onLoadFinished(Loader loader, Cursor cursor) { 开关 (loader.getId()) { 案例 CONTACT_LOADER_ID: simpleCursorAdapter.swapCursor(cursor); 休息; } }

基本上,我将图像以字节 [] 形式保存在表格中,我必须将数据附加到视图,但它给我返回了这样的异常。

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(Native Method) 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): at 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(Native Method) 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): at dalvik.system.NativeStart.main(Native Method)

谁能告诉我为什么会出现这个异常以及如何解决这个问题?

谢谢!

【问题讨论】:

  • 如果你想将 blob 绑定到 imageview,你需要一些你自己的逻辑。 SimpleCursorAdapter 单独不起作用 - 它希望看到字符串,例如图片 uris。
  • 在 SimpleCursorAdapter 中使用 ViewBinder 绑定非字符串列
  • @pskin laalto,感谢您的回答,我会尝试使用 ViewBinder。

标签: android android-sqlite


【解决方案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;
    }


}

我为我的 SimpleCursorAdapter 设置 ViewBinder。

simpleCursorAdapter.setViewBinder(new MyViewBinder());

它对我很有效。这是输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 2011-11-01
    • 2017-06-04
    • 2020-01-19
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多