0

该程序应该执行的操作是当它启动时,并且单击活动栏上的摄像头图标时,摄像头将被打开,如果用户拍摄照片并保存,照片将保存在数据库中,照片将在相机实例消失后立即作为ListView中的缩略图显示在主页面上。使用ViewBinder,SimpleCursorAdapter,SQLite在ListView上显示摄像机拍摄的照片

但是到目前为止,我一直在SQLiteException中说“未知错误(代码0):nativeGetBlob中的INTEGER数据”。

每次在我执行一些调试之后运行我的代码之前,我会完全删除我的数据库,因此它将有一个全新的开始。而在我的数据库中,实际上存储过程显然是好的,因为我使用adb来检查我的数据库,并且我的命令提示符显示该表有两列,第一个是_id,第二个是图像列,图片存储在.PNG的形式。作为byte [],并且id是自动增加的。

我已经成功地获得一个测试图像显示为一个简单的ImageView(具有相同的SQLite存储代码),但是当我尝试在ListView上使用ViewBinder和SimpleCursorAdapter显示它时,我正在获取SQLiteException。我已经阅读了很多其他的问题,并尝试了他们整天的解决方案,但仍然陷入困境。任何知道如何调试我的程序的专家?

这里是我的代码至今:

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中:

<?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 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> 

列表视图。 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:

<?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:

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) 

谢谢你这么多

回答