选择超过10张图片时应用崩溃

时间:2018-12-26 11:13:57

标签: java android

我正在使用android studio-java编码一个android应用,当从图库中选取10张以上的图像并将其插入到Sqlitedatabase表中时,我面临一个问题,而插入第10张图像所需的时间比最后9张图片,并且从表格中选择所有图片(10张)时,应用会因错误而崩溃

  

E / SQLiteCursor:onMove()返回false。 RequiredPos:9 WindowStartPos:9 WindowRowCount:0(查询的原始计数:10)
  原因:android.database.CursorIndexOutOfBoundsException:请求的索引-1,大小为10

代码

  

拾取和插入图像代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode== 1  && resultCode == RESULT_OK) {
        try {
            ClipData clipData = data.getClipData();
            if (clipData == null)
                return;
            for (int i = 0; i < clipData.getItemCount(); i++) {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), clipData.getItemAt(i).getUri());
                byte[] myImg = getBitmapAsByteArray(bitmap);
                DatabaseHelper databaseHelper = new DatabaseHelper(this);
                SQLiteDatabase db = databaseHelper.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put("myImage",myImg);
                db.insert("myTable",null,contentValues);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  

getBitmapAsByteArray()

 private static byte[] getBitmapAsByteArray(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
    return outputStream.toByteArray();
}
  

从数据库中选择图像

 public void showImages(View view) {
    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from myTable",null);
    cursor.moveToFirst();
    Toast.makeText(this, ""+cursor.getCount(), Toast.LENGTH_SHORT).show();
    ArrayList<Bitmap> bitmaps = new ArrayList<>();
    if (cursor.getCount()>0)
        while (!cursor.isAfterLast())
        {
            bitmaps.add(BitmapFactory.decodeByteArray(cursor.getBlob(0), 0, cursor.getBlob(0).length));
            cursor.moveToNext();
        }

    ViewPagerAdapter adapter = new ViewPagerAdapter(this,bitmaps);
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(0);
    cursor.close();
}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

它是索引超出范围的异常。 您的循环为负数,您正在访问索引-1处不存在的行。 在循环中尝试错误。 请提供您的Java文件代码。 它可能有助于发现更多错误。

答案 1 :(得分:1)

不确定代码,但我不会直接将图像存储在数据库中。图像可能真的很大,可能需要花费一些时间来写入和读取多个图像。

相反,就像后端开发人员所做的那样,我会将图像存储为文件在文件系统(app private directory)上。删除应用程序后,它们将被删除。将图像另存为文件,并将其路径或名称存储到数据库中。因此,只要您需要图像,就要做:

  1. AUTHENTICATION_BACKENDS = ( 'users.backends.Emailbackend', )
  2. List<String> getImageNamesFromDb()
  3. List<File> getImageFiles(List<String>)