首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择10多幅图像时应用程序崩溃

选择10多幅图像时应用程序崩溃
EN

Stack Overflow用户
提问于 2018-12-26 11:13:56
回答 2查看 303关注 0票数 0

我正在使用android java编写一个android应用程序,当我从库中选择10多幅图像并将它们插入Sqlitedatabase表时,当插入第10幅图像时,所花费的时间比前9幅图像要长得多,当从表中选择所有图像(10)时,应用程序会出现错误。

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

代码

提取和插入图像代码

代码语言:javascript
复制
@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()

代码语言:javascript
复制
 private static byte[] getBitmapAsByteArray(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
    return outputStream.toByteArray();
}

从数据库中选择图像

代码语言:javascript
复制
 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();
}

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-26 11:50:47

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

相反,就像后端开发人员所做的那样,我将图像存储为文件系统( Filesystem,app专用目录)。当应用程序被删除时,它们将被删除。将图像保存为文件,并将其路径或名称存储到DB中。因此,无论何时你需要图像,只要做:

  1. List<String> getImageNamesFromDb()
  2. List<File> getImageFiles(List<String>)
  3. processYourImageFiles(List<File>)
票数 1
EN

Stack Overflow用户

发布于 2018-12-26 11:22:18

它是一个超出界限异常的索引。您的循环是负的,在索引-1处访问一个不存在的行。尝试循环中的错误。请给出您的java文件代码。这可能有助于发现更多的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53931301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档