【问题标题】:Exception when request an image from database从数据库请求图像时出现异常
【发布时间】:2023-04-06 22:16:02
【问题描述】:

当我向我的数据库 (sqlite) 发送请求以加载图像时,我的光标始终为 -1。

public Cursor getData(int id){

        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME + " WHERE ID = " + id;
        Log.d(TAG, query);
        Cursor data = db.rawQuery(query, null);
        return data;
}

结果是应用程序崩溃,并且此日志记录在 logcat 中:

致命异常:主要 进程:com.master.tobias.phono,PID:10721 android.database.CursorIndexOutOfBoundsException: 请求索引-1,大小为1

编辑:该查询在 SQLite 的 DB Browser 中运行良好。

【问题讨论】:

  • 请贴出完整代码
  • 你没有调用moveToNext()方法
  • 这是很好的解释stackoverflow.com/a/12445030/1854103。基本上你应该调用 data.moveToFirst() (在你的情况下是名为数据的游标)

标签: android sqlite


【解决方案1】:

在访问游标数据之前尝试cursor.moveToFirst()

【讨论】:

    【解决方案2】:

    试试这个

    public Cursor getData(int id){
    
            SQLiteDatabase db = this.getWritableDatabase();
            String query = "SELECT * FROM " + TABLE_NAME + " WHERE ID = " + id;
            Log.d(TAG, query);
            Cursor cursor= db.rawQuery(query, null);
            while(cursor.moveToFirst()){
              //get your value over here
            }
            return data;
    }
    

    【讨论】:

      【解决方案3】:

      查看方法的 Android 文档也很有帮助,因为它提供了有关方法(如果期望作为参数并将返回)的更多信息。首先,db.rawQuery

      运行提供的 SQL 并在结果集上返回游标。
      SQLiteDatabase

      至于游标,你需要用Cursor变量来检查一个对象是否存在。这可以通过使用以下方法来完成:

      cursor.moveToFirst();
      

      将光标移动到下一行。
      如果光标已经超过结果集中的最后一个条目,则此方法将返回 false。
      Cursor

      此方法将返回一个布尔值,您可以将其用于进一步验证。如果布尔值为 false,则游标中不包含任何数据/对象。如果它是真的,你知道你有数据的存在。

      因此,您缺少此功能,您需要将对象移动到第一行,这将允许您确定查询是否为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        相关资源
        最近更新 更多