【问题标题】:How to using cursor in loop? [duplicate]如何在循环中使用游标? [复制]
【发布时间】:2015-05-02 23:56:26
【问题描述】:

问题是我无法加载我的图像,也许我在这里遇到了问题。也许这段代码会出错“java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0”抱歉,我无法描述我的问题 T_T。我是安卓新手。

quest.setImage(Utility.getPhoto(cursor.getBlob(1))); //也许我得到了 这里有问题

DbHelper.java

public List<Question> getAllQuestions(){
            List<Question> quesList = new ArrayList<Question>();
            String selectQuery = "SELECT * FROM " + TABLE_QUEST + " ORDER BY RANDOM() LIMIT 5";
            dbase=this.getReadableDatabase();
            Cursor cursor = dbase.rawQuery(selectQuery, null);
            // looping through all rows and adding to list
            //==============================================
            if (cursor.moveToFirst()) {
                do {
                    Question quest = new Question();

                    quest.setID(cursor.getInt(0));
                    quest.setImage(Utility.getPhoto(cursor.getBlob(1)));
                    quest.setQUESTION(cursor.getString(2));
                    quest.setANSWER(cursor.getString(3));
                    quest.setOPTA(cursor.getString(4));
                    quest.setOPTB(cursor.getString(5));
                    quest.setOPTC(cursor.getString(6));
                    quesList.add(quest);
                } while (cursor.moveToNext());
            }
            // return quest list
            return quesList;
        }

问题.java

    public Bitmap getBitmap(){
     return bmp;
}
    public void setImage(Bitmap img){
    bmp = img;
}

实用程序.java

public class Utility {
    // convert from bitmap to byte array
    public static byte[] getBytes(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 0, stream);
        return stream.toByteArray();
    }

    // convert from byte array to bitmap
    public static Bitmap getPhoto(byte[] image) {
        return BitmapFactory.decodeByteArray(image, 0, image.length);
    }
}

【问题讨论】:

  • 您可以删除 if(cursor.moveToFirst()) 语句。默认情况下,返回的光标位于第一个条目之前。所以你只需要 while(cursor.moveToNext()).
  • @hitch.united,你能举个例子吗?我是新手..
  • 当然,将整个 if(cursor.moveToFirst()){ do { } while (cursor.moveToNext()) } 替换为简单的 while(cursor.moveToNext()){ ... .问题代码在这里}

标签: java android arrays sqlite


【解决方案1】:

您的查询似乎没有返回您期望的所有 7 列。

列出查询中的所有实际列名(始终是一个好习惯),这样它会更快地失败并提供更具描述性的消息。

String selectQuery = "SELECT fielName1, fieldName2, "
    + " ..., lastFieldName FROM " + TABLE_QUEST + " ORDER BY RANDOM() LIMIT 5";

【讨论】:

  • 我认为查询失败了。
  • 可能是 random() 的顺序
  • 应该是 ORDER BY rand()
  • 不错。那会抛出java.lang.IndexOutOfBoundsException吗?
  • 所以你在不存在的结果中超出了界限
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多