简体   繁体   English

使用ViewBinder,SimpleCursorAdapter,SQLite在ListView上显示相机拍摄的图片

[英]Using ViewBinder, SimpleCursorAdapter, SQLite, to show pictures taken by a camera on ListView

What this program is supposed to do is when it starts up, and when the camera icon on the activity bar is clicked, a camera will be opened and if a user takes a photo and oks to save it the picture will be saved in the database and the photo will be shown on the main page as a thumbnail in a ListView immediately after the camera instance is gone. 该程序应该做的是启动它,并且单击活动栏上的相机图标,将打开相机,并且如果用户拍摄照片并确定要保存,则该图片将保存在数据库中相机实例消失后,照片将以缩略图形式在ListView中显示在主页上。

However so far I have been getting a SQLiteException saying "unknown error (code 0): INTEGER data in nativeGetBlob". 但是到目前为止,我一直在收到一个SQLiteException,上面写着“未知错误(代码0):nativeGetBlob中的INTEGER数据”。

Each time before I run my code after doing some debugging I would remove my database entirely so it would have a fresh start. 每次在进行一些调试之后运行代码之前,我都会完全删除数据库,以便重新启动数据库。 And in my database actually the storing process was apparently ok because I use adb to check my database and my command prompt shows that the table has two columns, first one is the _id and the second is the images column, the pictures are stored in the form of .PNG. 在我的数据库中,实际上存储过程显然是可以的,因为我使用adb检查我的数据库,并且命令提示符显示该表有两列,第一列是_id,第二列是images列,图片存储在.PNG的形式。 as byte[], and the ids are autoincremented. 作为byte [],并且id会自动递增。

I have succeeded getting just one test image to show as a simple ImageView (with the same SQLite storing code) but when I attempt to show it on a ListView, using ViewBinder and SimpleCursorAdapter I am getting the SQLiteException. 我已经成功地获得了一个测试图像,以简单的ImageView形式显示(具有相同的SQLite存储代码),但是当我尝试使用ViewBinder和SimpleCursorAdapter在ListView上显示它时,却出现了SQLiteException。 I have read many other questions here and try their solutions for the whole day already but still stuck. 我在这里阅读了许多其他问题,并已经尝试了一整天的解决方案,但是仍然遇到问题。 Any expert out there who knows how to debug my program? 有没有知道如何调试我的程序的专家?

Here are my codes so far: 到目前为止,这是我的代码:

MainActivity.java: MainActivity.java:

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import java.io.ByteArrayOutputStream;


public class MainActivity extends ActionBarActivity {

    static final int REQUEST_IMAGE_CAPTURE = 1;
    SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = this.openOrCreateDatabase("images.db", Context.MODE_PRIVATE, null);
        db.execSQL("create table if not exists tb (  _id INTEGER PRIMARY KEY AUTOINCREMENT, image blob)");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        //dispatchTakePictureIntent();
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            //Calling dispatchTakePictureIntent to start the camera activity
            dispatchTakePictureIntent();
            return true;
        }

        return super.onOptionsItemSelected(item);

    }


    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            /*Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            ImageView thumb1 = (ImageView) findViewById(R.id.thumb1);
            thumb1.setImageBitmap(imageBitmap);*/
            ////////////////////////////////////////////////////////////////////////

            Bundle extras = data.getExtras();
            Bitmap imageTaken = (Bitmap) extras.get("data");

            ContentValues values = new ContentValues();
            //calculate how many bytes our image consists of.
           /* int bytes = imageTaken.getByteCount();
            //or we can calculate bytes this way. Use a different value than 4 if you don't use 32bit images.
            //int bytes = b.getWidth()*b.getHeight()*4;

            ByteBuffer buffer = ByteBuffer.allocate(bytes); //Create a new buffer
            imageTaken.copyPixelsToBuffer(buffer); //Move the byte data to the buffer

            byte[] toValuesPut = buffer.array(); //Get the underlying array containing the data.
            */
           byte[] toValuesPut = this.getBytes(imageTaken);
            values.put("image", toValuesPut);
            db.insert("tb", null, values);
            getImage();

            ///////////////////////////////////////////////////////////////

            db.close();
        }

    }

    protected void getImage(){
        Cursor c = db.rawQuery("select * from tb", null);
        if (c.moveToNext()){
            //byte[] image = c.getBlob(0);
            //Bitmap bmp = BitmapFactory.decodeByteArray(image, 0, image.length);
            //ImageView thumb1 = (ImageView) findViewById(R.id.thumb1);
            // thumb1.setImageBitmap(bmp);
            ListView listView = (ListView) findViewById(R.id.sampleListView);
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                    R.layout.photos, c, new String[] { "_id", "image" }, new int[]{R.id.col1, R.id.col2});

            SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() {

                public boolean setViewValue(View view, Cursor cursor,
                                            int columnIndex) {
                    ImageView image = (ImageView) view;
                    byte[] byteArr = cursor.getBlob(columnIndex);
                    image.setImageBitmap(BitmapFactory.decodeByteArray(byteArr, 0, byteArr.length));
                    return true;
                }
            };
            ImageView image = (ImageView) findViewById(R.id.editimage);
            viewBinder.setViewValue(image, c, c.getColumnIndex("_id"));
            adapter.setViewBinder(viewBinder);
            listView.setAdapter(adapter);

        }
    }
    public static byte[] getBytes(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
        return stream.toByteArray();
    }

}

activity_main.xml: activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:weightSum="1">

<TableRow
    android:id="@+id/tableRow1"
    android:layout_width="793dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.23" >

    <TextView android:id="@+id/col1"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        android:width="50dp"
        android:textSize="18sp"

        />
    <TextView android:id="@+id/col2"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        android:width="150dp"
        android:textSize="18sp"
        />
    <ImageView android:id="@+id/editimage"

        android:clickable="true"
        android:onClick="ClickHandlerForEditImage"
        android:layout_width="35dp"
        android:layout_height="35dp"/>

</TableRow>

</LinearLayout>

menu_main.xml: menu_main.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:icon="@drawable/camera"
        android:orderInCategory="100"
        app:showAsAction="ifRoom" />
</menu>

listview.xml: listview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <ListView
        android:id="@+id/sampleListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="5dp"
        android:background="@android:color/transparent"
        android:cacheColorHint="@android:color/transparent"
        android:divider="#CCCCCC"
        android:dividerHeight="1dp"
        android:paddingLeft="2dp" >
    </ListView>

</LinearLayout>

photos.xml: photos.xml:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/thumb2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="24sp"/>

Logcat: logcat的:

Caused by: android.database.sqlite.SQLiteException: unknown error (code 0): INTEGER data in nativeGetBlob
            at android.database.CursorWindow.nativeGetBlob(Native Method)
            at android.database.CursorWindow.getBlob(CursorWindow.java:403)
            at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:45)
            at hiew1.is2.byuh.edu.mydailyselfie.MainActivity$1.setViewValue(MainActivity.java:133)
            at hiew1.is2.byuh.edu.mydailyselfie.MainActivity.getImage(MainActivity.java:139)
            at hiew1.is2.byuh.edu.mydailyselfie.MainActivity.onActivityResult(MainActivity.java:108)
            at android.app.Activity.dispatchActivityResult(Activity.java:6192)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3573)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3620)
            at android.app.ActivityThread.access$1300(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)

Thank you so much 非常感谢

Perhaps you can try following this example, without using ViewBinder and SimpleCursorAdapter. 也许您可以尝试遵循此示例,而不使用ViewBinder和SimpleCursorAdapter。 Just use the method bindblob() and a Cursor: 只需使用方法bindblob()和一个Cursor:

How to store image in SQLite database 如何在SQLite数据库中存储图像

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在现有的SQLite ListView(ViewBinder)中显示内部存储器中的图片 - Show pictures from internal storage in existing SQLite ListView (ViewBinder) 使用SimpleCursorAdapter和ViewBinder在ListView项目中设置图像 - Setting an image in ListView item using SimpleCursorAdapter and ViewBinder 使用ViewBinder将SQLite BLOB列转换为SimpleCursorAdapter - SQLite BLOB column to SimpleCursorAdapter with ViewBinder 使用SimpleCursorAdapter.ViewBinder更改Listview中的文本颜色 - Changing text color in Listview using SimpleCursorAdapter.ViewBinder 使用SimpleCursorAdapter.ViewBinder更改listView中的颜色。 安卓 - Using SimpleCursorAdapter.ViewBinder to change color in a listView. android 使用SimpleCursorAdapter.ViewBinder更改TextView的颜色 - Using SimpleCursorAdapter.ViewBinder to change the color of TextView 使用SimpleCursorAdapter.ViewBinder更改视图的颜色 - Using SimpleCursorAdapter.ViewBinder to change the color of View 使用ViewBinder从SimpleCursorAdapter中显示的自定义列表 - Customizing list shown from SimpleCursorAdapter using ViewBinder simplecursoraapter/listview 到 sqlite 数据库 - simplecursoradapter/listview to sqlite database SimpleCursorAdapter和ViewBinder - 将数据绑定到ListView项目,以便在单击时检索 - SimpleCursorAdapter and ViewBinder - Binding data to ListView items to be retrieved on click
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM