Android 安卓:确保光标在访问数据之前已正确初始化

Android 安卓:确保光标在访问数据之前已正确初始化,android,android-sqlite,Android,Android Sqlite,当我从SQLite数据库表中检索一些数据时,我收到一个错误请确保在从游标访问数据之前正确初始化游标 这是我的问题 dbhelper = new MyDbHelper(getContext()); SQLiteDatabase db = dbhelper.getReadableDatabase(); Cursor cursor1 = db.rawQuery("select MAX(activityObjId) from

当我从SQLite数据库表中检索一些数据时,我收到一个错误请确保在从游标访问数据之前正确初始化游标

这是我的问题

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();

如果光标可用,可以使用以下方法进行尝试:

if( cursor1 != null && cursor1.moveToFirst() )
在我的例子中,这也是我成功使用游标的方式:

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

您可以在cursor1.getColumnIndex(0)中使用索引


您应该使用适当的
DB\u处理程序
类来处理SQLite DB工作,大多数开发人员现在都在关注这个工作。我建议您为SQLite数据库创建一个单独的java类,并创建插入、更新、删除等方法来对数据库执行操作

现在来问你的问题。由于光标未从查询中获得所需的结果,所以出现异常。因此,首先在
select
where
子句中签入查询列名,这些列名应与创建表时的列名匹配。在查询中的
from
关键字之后确认您的
表\u名称
,然后使用游标进行适当的检查,如

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数据库

编辑


根据@Ganpat Kaliya的回答。我没有注意到这一点。OP在
select
子句中使用
MAX(col\u name)
并使用
c.getColumnIndex('col\u name')
因此
c.getString(0)
根据OP的当前查询完成了操作。

您的查询包含该列

MAX(activityObjId)
但您尝试使用其他名称检索列:

cursor1.getColumnIndex("activityObjId")
因此,
getColumnIndex()
返回-1,尝试检索此类索引的值会导致异常

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

cursor1.getString(0)

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

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

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

从包含1行1列的CursorWindow读取第0行第1列时仍然出现错误。如果需要,最好使用whereRGS,因为OP在其代码中有。如果(cursor1!=null&&cursor1.getCount()){if(cursor1.moveToFirst())}请尝试此选项,我希望您的查询有问题,否则所需的表可能为空。请检查表中是否有任何数据。还要检查您使用的列键是否正确
getColumnIndex
a
String
参数不
int
,您的答案代码无法在all@GanpatKaliya说得好。我没有注意到查询在select子句中有max(activityObjId),在使用getColumnIndex(“col_name”)时有OP,所以对cursor1.getString(0)有+1
maxACtivityObjId  = cursor1.getString(cursor1.getColumnIndex("MaxValue"));