android 中的 CursorIndexOutOfBoundException 索引 0 大小 0
CursorIndexOutOfBoundException index 0 size 0 in android
我正在尝试在我的应用程序中实现一项功能,如果用户之前登录过,SOS
按钮将显示在登录屏幕中。否则,SOS
按钮将不会显示。
为此,我在 SQLite 中创建了一个数据库 table,专门用于跟踪用户之前是否登录过。
每当用户登录时,将在 table.
中插入一个字符串值 LoggedIn
加载登录页面时,从数据库中获取登录状态数据table。如果数据是 LoggedIn
,我将显示 SOS
按钮,否则,我将显示 SOS
按钮不可见。
我正在使用以下方法获取状态数据,但出现异常:
CursorIndexOutOfBoundException index 0 size 0
public String getLoggedInStatus()
{
SQLiteDatabase db = getReadableDatabase();
String status="";
String query = "SELECT * FROM LoggedInStatus"; //LoggedInStatus is my table to store login status
Cursor cursor = db.rawQuery(query,null);
if (cursor != null) {
cursor.moveToFirst();
status = cursor.getString(0);
//Exception is occuring in the above line
}
return status;
}
我该如何解决这个问题?如何正确读取游标中的数据?
检查计数也大于零
if(cursor!=null && cursor.getCount()>0)
{
cursor.moveToFirst();
status = cursor.getString(0);
}
您的代码几乎正确。但是 cursor.moveToFirst();
returns true
或 false
取决于 Cursor
是否能够迭代。
因此,默认情况下 android 的 Cursor
具有索引 -1
作为默认值以使其在 while
循环内工作。为确保您的 Cursor
中包含任何元素,请将您的代码包装在此 if
语句中:
if (cursor != null && cursor.moveToNext()) {
cursor.getString(0);
// To get the element count you can use cursor.getCount();
}
参考:https://developer.android.com/reference/android/database/Cursor#moveToNext()
很可能 table 中没有行。
检查它有多种方法,其中之一是:
if(cursor.moveToFirst())
{
status = cursor.getString(0);
}
消息说您正在尝试从第一行的第一列读取(提取数据)但没有第一行,因此索引 0(第 1 行)超出范围(第 0 列将始终存在,否则查询将无效并失败并显示另一条消息(可能是语法错误))。
原因是没有行被 returned。从 rawQuery
方法(或等效的 query
便捷方法)检查空 Cursor 是无用的,因为 Cursor 将被 returned。但是,如果 Cursor 没有行,它将为空,因此 getCount
方法将为 return 0 。
光标的 move????
方法(例如 moveToFirst
)如果无法移动,也会 return 错误。
因此,您可以不使用 if (cursor != null) {........}
,而是使用 if (cursor.moveToFirst()) { ...... }
或者如果 (cursor.getCount() > 0) {......}
.
因此,以下内容将解决此问题:-
public String getLoggedInStatus()
{
SQLiteDatabase db = getReadableDatabase();
String status="";
String query = "SELECT * FROM LoggedInStatus"; //LoggedInStatus is my table to store login status
Cursor cursor = db.rawQuery(query,null);
if (cursor.moveToFirst) { //<<<<<<<<<< CHANGED
cursor.moveToFirst();
status = cursor.getString(0);
}
cursor.close() //<<<<<<<<<< You should always close cursors when done with them
return status;
}
- 请注意,如果没有要 returned 的行,
getLoggedInStatus
方法将 return 一个空字符串。
我正在尝试在我的应用程序中实现一项功能,如果用户之前登录过,SOS
按钮将显示在登录屏幕中。否则,SOS
按钮将不会显示。
为此,我在 SQLite 中创建了一个数据库 table,专门用于跟踪用户之前是否登录过。 每当用户登录时,将在 table.
中插入一个字符串值LoggedIn
加载登录页面时,从数据库中获取登录状态数据table。如果数据是 LoggedIn
,我将显示 SOS
按钮,否则,我将显示 SOS
按钮不可见。
我正在使用以下方法获取状态数据,但出现异常:
CursorIndexOutOfBoundException index 0 size 0
public String getLoggedInStatus()
{
SQLiteDatabase db = getReadableDatabase();
String status="";
String query = "SELECT * FROM LoggedInStatus"; //LoggedInStatus is my table to store login status
Cursor cursor = db.rawQuery(query,null);
if (cursor != null) {
cursor.moveToFirst();
status = cursor.getString(0);
//Exception is occuring in the above line
}
return status;
}
我该如何解决这个问题?如何正确读取游标中的数据?
检查计数也大于零
if(cursor!=null && cursor.getCount()>0)
{
cursor.moveToFirst();
status = cursor.getString(0);
}
您的代码几乎正确。但是 cursor.moveToFirst();
returns true
或 false
取决于 Cursor
是否能够迭代。
因此,默认情况下 android 的 Cursor
具有索引 -1
作为默认值以使其在 while
循环内工作。为确保您的 Cursor
中包含任何元素,请将您的代码包装在此 if
语句中:
if (cursor != null && cursor.moveToNext()) {
cursor.getString(0);
// To get the element count you can use cursor.getCount();
}
参考:https://developer.android.com/reference/android/database/Cursor#moveToNext()
很可能 table 中没有行。
检查它有多种方法,其中之一是:
if(cursor.moveToFirst())
{
status = cursor.getString(0);
}
消息说您正在尝试从第一行的第一列读取(提取数据)但没有第一行,因此索引 0(第 1 行)超出范围(第 0 列将始终存在,否则查询将无效并失败并显示另一条消息(可能是语法错误))。
原因是没有行被 returned。从 rawQuery
方法(或等效的 query
便捷方法)检查空 Cursor 是无用的,因为 Cursor 将被 returned。但是,如果 Cursor 没有行,它将为空,因此 getCount
方法将为 return 0 。
光标的 move????
方法(例如 moveToFirst
)如果无法移动,也会 return 错误。
因此,您可以不使用 if (cursor != null) {........}
,而是使用 if (cursor.moveToFirst()) { ...... }
或者如果 (cursor.getCount() > 0) {......}
.
因此,以下内容将解决此问题:-
public String getLoggedInStatus()
{
SQLiteDatabase db = getReadableDatabase();
String status="";
String query = "SELECT * FROM LoggedInStatus"; //LoggedInStatus is my table to store login status
Cursor cursor = db.rawQuery(query,null);
if (cursor.moveToFirst) { //<<<<<<<<<< CHANGED
cursor.moveToFirst();
status = cursor.getString(0);
}
cursor.close() //<<<<<<<<<< You should always close cursors when done with them
return status;
}
- 请注意,如果没有要 returned 的行,
getLoggedInStatus
方法将 return 一个空字符串。