Android:确保在从中访问数据之前正确初始化Cursor

时间:2015-09-28 04:23:19

标签: android android-sqlite

我收到错误在从SQLite数据库表中检索某些数据时,确保在从中访问数据之前正确初始化Cursor

这是我的查询

dbhelper = new MyDbHelper(getContext());
                    SQLiteDatabase db = dbhelper.getReadableDatabase();
                    Cursor cursor1 = db.rawQuery("select MAX(activityObjId) from ActivityObjectList where activityId " + "= ? ", new String[]{string_ActivityId});

                    if (cursor1.moveToFirst())
                    {
                        maxACtivityObjId  = cursor1.getString(cursor1.getColumnIndex("activityObjId"));
                        Log.e("MAX  ", "maxACtivityObjId = " + maxACtivityObjId);
                    }
                    cursor1.close();
                    db.close();

5 个答案:

答案 0 :(得分:3)

您的查询包含列

MAX(activityObjId)

但您尝试使用其他名称检索列:

cursor1.getColumnIndex("activityObjId")

因此getColumnIndex()返回-1并尝试检索此类索引的值会导致异常。

解决方案:使用您在头脑中计算的索引进行检索:

cursor1.getString(0)

答案 1 :(得分:2)

试试这个,

你可以在cursor1.getColumnIndex(0)中使用index。

dbhelper = new MyDbHelper(getContext());
                    SQLiteDatabase db = dbhelper.getReadableDatabase();
                    Cursor cursor1 = db.rawQuery("select MAX(activityObjId) from ActivityObjectList where activityId " + "= ? ", new String[]{string_ActivityId});

                    if (cursor1.moveToFirst())
                    {
                        maxACtivityObjId  = cursor1.getString(cursor1.getColumnIndex(0));
                        Log.e("MAX  ", "maxACtivityObjId = " + maxACtivityObjId);
                    }
                    cursor1.close();
                    db.close();

答案 2 :(得分:0)

如果您的光标可用,您可以使用以下命令:

if( cursor1 != null && cursor1.moveToFirst() )

同样在我的情况下,这就是我成功使用游标的方式:

Cursor cursor = sql.rawQuery(query, null);

答案 3 :(得分:0)

您应该使用适当的DB_Handler类来完成SQLite数据库工作,大多数开发人员现在都会使用它。我建议你为你的SQLite数据库创建一个单独的java类,并使用插入,更新,删除等方法对数据库执行操作

现在回答你的问题。您将获得异常,因为您的光标未获得查询所需的结果。因此,首先检查查询中selectwhere子句中的列名应与创建表时的列名匹配。同时在您的查询中确认table_name from关键字然后使用适当的检查(例如

)从光标中获取您的查询
String query = "select MAX(activityObjId) from ActivityObjectList where activityId " + string_ActivityId;
Cursor c = db.rawQuery(query, null);

if(c.getCount() > 0)
{
   c.moveToFirst();
   while(!c.isAfterLast())
   {
      maxACtivityObjId  = cursor1.getString(cursor1.getColumnIndex("activityObjId"));
      Log.e("MAX  ", "maxACtivityObjId = " + maxACtivityObjId);// here you should check your column name and match (spellings) with column names at the time of creating table
      c.moveToNext();
   }
   c.close();
} 

此外,您应该按照适当的教程来处理Android应用程序中的SQLite数据库。 Use This Link

修改

根据@Ganpat Kaliya回答。我没有注意到这一点。 OP使用MAX(col_name)子句中的select并使用c.getColumnIndex('col_name')使c.getString(0)根据OP的当前查询进行操作。

答案 4 :(得分:0)

您正试图访问此列activityObjId,该列在您的光标中不是PPRESENT(您只有Max(activityObjId))。
您可以为该列使用ALIAS,然后访问该别名:

Cursor cursor1 = db.rawQuery("SELECT Max(activityObjId) AS MaxValue FROM ActivityObjectList WHERE activityId " + "= ? ", new String[]{string_ActivityId});

然后访问它

maxACtivityObjId  = cursor1.getString(cursor1.getColumnIndex("MaxValue"));