Android 安卓:确保光标在访问数据之前已正确初始化
当我从SQLite数据库表中检索一些数据时,我收到一个错误请确保在从游标访问数据之前正确初始化游标 这是我的问题Android 安卓:确保光标在访问数据之前已正确初始化,android,android-sqlite,Android,Android Sqlite,当我从SQLite数据库表中检索一些数据时,我收到一个错误请确保在从游标访问数据之前正确初始化游标 这是我的问题 dbhelper = new MyDbHelper(getContext()); SQLiteDatabase db = dbhelper.getReadableDatabase(); Cursor cursor1 = db.rawQuery("select MAX(activityObjId) from
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
aString
参数不int
,您的答案代码无法在all@GanpatKaliya说得好。我没有注意到查询在select子句中有max(activityObjId),在使用getColumnIndex(“col_name”)时有OP,所以对cursor1.getString(0)有+1
maxACtivityObjId = cursor1.getString(cursor1.getColumnIndex("MaxValue"));