在ViewFlipper中显示图像数据库

时间:2018-01-05 17:43:10

标签: android database sqlite android-viewflipper

我必须按钮:第一个按钮用于从图库到数据库保存图像,第二个按钮用于在viewFlipper中显示来自数据库的图像,但第二个按钮不起作用并且有错误

第一个按钮:

public void save(View view)
{
        if(bitmap != null) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
            byte[] byteImage = stream.toByteArray();

            ContentValues values = new ContentValues();
            values.put(imageColumnName, String.valueOf(byteImage));

            db.insert(tableName, null, values);

            Toast.makeText(this, "Save", Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(this, "Save Image First!", Toast.LENGTH_SHORT).show();
        }


 }

第二个按钮:

public void showImage(View view)
{
    ViewFlipper viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipper);
    viewFlipper.setFlipInterval(2500);
    viewFlipper.startFlipping();

    cursor = db.rawQuery(Query_Select_All ,  null);
    int i = 1;
    if(cursor.getCount() != 0)
        while (cursor.moveToNext())
        {
            Cursor cursor2 = db.rawQuery("select image from imageColumns where id = "+i , null);
            String path = cursor2.getString(cursor2.getColumnIndex(imageColumnName));
            File imageFile = new File(path);
            Bitmap bitmapImage = BitmapFactory.decodeFile(imageFile.toString());
            ImageView imageView = new ImageView(this);
            imageView.setImageBitmap(bitmapImage);
            viewFlipper.addView(imageView);
            i++;
        }
    }

logcat错误:

java.lang.IllegalStateException: Could not execute method for android:onClick   
Caused by: java.lang.reflect.InvocationTargetException 
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

1 个答案:

答案 0 :(得分:2)

索引-1 是由getColumnIndex未在此行的表格中找到列名String path = cursor2.getString(cursor2.getColumnIndex(imageColumnName));

引起的

根据imageColumnName image select,image无法解析为..,即提取光标的查询所选择的列强> Cursor cursor2 = db.rawQuery("select image from imageColumns where id = "+i , null);

你可能会改变: -

    Cursor cursor2 = db.rawQuery("select " + imageColumnName + " from imageColumns where id = "+i , null); // The cursor includes just the one column

    Cursor cursor2 = db.rawQuery("select * from imageColumns where id = "+i , null); // The cursor includes all columns (most flexible)

public void showImage(View view)
{
    ViewFlipper viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipper);
    viewFlipper.setFlipInterval(2500);
    viewFlipper.startFlipping();

    cursor = db.rawQuery(Query_Select_All ,  null);
    int i = 1;
    if(cursor.getCount() != 0)
        while (cursor.moveToNext())
        {
            Cursor cursor2 = db.rawQuery("select * from imageColumns where id = "+i , null);
            String path = cursor2.getString(cursor2.getColumnIndex(imageColumnName));
            File imageFile = new File(path);
            Bitmap bitmapImage = BitmapFactory.decodeFile(imageFile.toString());
            ImageView imageView = new ImageView(this);
            imageView.setImageBitmap(bitmapImage);
            viewFlipper.addView(imageView);
            i++;
        }
    }

因此,以下内容可能有效: -

 val client = OkHttpClient()

 val time = client.connectTimeoutMillis() // it's get only methood but i looking for method for set Timeout

备注

  • 使用或许很可能是因为提供的代码中的列的实际名称不清楚。
  

我和其他许多人会建议在表的相应类中创建常量   名称,列和数据库名称,并始终使用它们而不是   在整个代码中对这些名称进行硬编码,以便只有   一个定义。这样做可以减少/消除这样容易   错误。