我的应用程序抛出游标索引outOfBounds异常,要求-1且大小为1

时间:2018-12-25 17:52:27

标签: android cursor blob

当我尝试从sqlite数据库中检索blob时,光标抛出了index outofbounds异常。

我的DataBaseHelper类是:

public class DataBaseHelper extends SQLiteOpenHelper {
    public static final String Database_Name="images.db";
    public static final String Table_Name="imgs";
    Bitmap bitmap;
    public DataBaseHelper(Context context) {
        super(context, Database_Name,null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table "+Table_Name+"(id integer primary key autoincrement , image blob)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("drop table if esists "+Table_Name);
    }
    public boolean insert(byte[] img)
    {

        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put("image",img);
        long insert=db.insert(Table_Name,null,cv);
        if(insert==-1)
        {
            return  false;
        }
        else
        {
            return true;
        }
    }

我的结果类:

public class Results extends AppCompatActivity {
    ImageView imageView;
    DataBaseHelper mDataBaseHelper;
    Bitmap img;
    Bitmap bitmap;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_results);
        textView=(TextView)findViewById(R.id.textView3);
        mDataBaseHelper=new DataBaseHelper(this);
        SQLiteDatabase db=mDataBaseHelper.getReadableDatabase();
        Toast.makeText(getApplicationContext(),"Emm",Toast.LENGTH_LONG).show();
        Cursor cursor=db.rawQuery("select* from "+mDataBaseHelper.Table_Name,null);
        byte[] imageArray=cursor.getBlob(3);
        bitmap=BitmapFactory.decodeByteArray(imageArray,0,imageArray.length);
        imageView.setImageBitmap(bitmap);
    }
}

上面的结果代码抛出cursor index outofbounds exception,index -1 requested with size of 1

2 个答案:

答案 0 :(得分:1)

if (cursor.moveToNext()){ cursor.getBlob(cursor.getColumnIndexOrThrow(yourColumnName)); }

通过这种方式,您可以将光标移动到返回的数据集的第一行上。 无论如何,您的select语句中似乎都缺少空格。

答案 1 :(得分:0)

要从中获取行的表mDataBaseHelper.Table_Name
通过执行以下语句:

"select * from " + mDataBaseHelper.Table_Name

只有1列,但是您尝试通过以下方式获得第4列:

byte[] imageArray=cursor.getBlob(3);

CREATE类中的SQLiteOpenHelper语句显示表中有2列:idimage,所以您应该这样做:

if (cursor.moveToFirst()) {
    byte[] imageArray=cursor.getBlob(1);
}
cursor.close();

尝试一下,但是如果再次遇到相同的错误,则意味着db中存在的表只有1列。
因此,如果问题仍然存在,请从仿真器/设备上卸载应用程序,以便数据库将被删除并再次运行以重新创建表。然后重新填充表格。