Android SQLite奇怪错误

Android SQLite奇怪错误,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,以前有没有人在这种情况下遇到过这种错误 无法从游标窗口读取第1行第8列 我知道这意味着它试图从第8列读取数据,但问题是我只有7列,而且我从来没有试图分配第8列的数据 我遇到的问题是,每当我清除数据并重新开始时,它工作正常,然后突然开始抛出错误 这是我的桌子: public String CREATE_TABLE = "CREATE TABLE BreakTests ( " + "Id INTEGER PRIMARY KEY AUTOINCREMENT, " + "

以前有没有人在这种情况下遇到过这种错误

无法从游标窗口读取第1行第8列

我知道这意味着它试图从第8列读取数据,但问题是我只有7列,而且我从来没有试图分配第8列的数据

我遇到的问题是,每当我清除数据并重新开始时,它工作正常,然后突然开始抛出错误

这是我的桌子:

public String CREATE_TABLE = "CREATE TABLE BreakTests ( " +
        "Id INTEGER PRIMARY KEY AUTOINCREMENT, " +
        "Answered_Question_Set_ID INTEGER, " +
        "PassValue INTEGER, " +
        "Value1 INTEGER, " +
        "Value2 INTEGER, " +
        "Value3 INTEGER, " +
        "Value4 INTEGER, " +
        "Value5 INTEGER)";
以下是我的专栏:

public final String KEY_ID = "Id";
public final String KEY_ANSWERED_QUESTION_SET_ID = "Answered_Question_Set_ID";
public final String KEY_PASS_VALUE = "PassValue";
public final String KEY_VALUE_1 = "Value1";
public final String KEY_VALUE_2 = "Value2";
public final String KEY_VALUE_3 = "Value3";
public final String KEY_VALUE_4 = "Value4";
public final String KEY_VALUE_5 = "Value5";

public final String[] COLUMNS = {KEY_ID, KEY_ANSWERED_QUESTION_SET_ID, KEY_PASS_VALUE, KEY_VALUE_1, KEY_VALUE_2, KEY_VALUE_3, KEY_VALUE_4, KEY_VALUE_5};
这是我的疑问:

 public ArrayList<BreakTest> GetForSync() {
    ArrayList<BreakTest> tests = new ArrayList<BreakTest>();

    String selectQuery = "SELECT Id, Answered_Question_Set_ID, PassValue, Value1, Value2, Value3, Value4, Value5 FROM BreakTests";
    Cursor cursor = Shared.db.getReadableDatabase().rawQuery(selectQuery, new String[] {  });
    BreakTest breakTest;
    if (cursor.moveToFirst()) {
        do {
            breakTest = new BreakTest();
            breakTest.Id = cursor.getInt(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
            breakTest.Answered_Question_Set_ID = cursor.getInt(cursor.getColumnIndex(KEY_ANSWERED_QUESTION_SET_ID));
            breakTest.PassValue = cursor.getInt(cursor.getColumnIndex(KEY_PASS_VALUE));
            breakTest.Value1 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_1));
            breakTest.Value2 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_2));
            breakTest.Value3 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_3));
            breakTest.Value4 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_4));
            breakTest.Value5 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_5));

            tests.add(breakTest);
        } while (cursor.moveToNext());
    }

    return tests;
}
public ArrayList GetForSync(){
ArrayList tests=新的ArrayList();
String selectQuery=“从BreakTests中选择Id、回答的问题、设置Id、PassValue、Value1、Value2、Value3、Value4、Value5”;
Cursor Cursor=Shared.db.getReadableDatabase().rawQuery(selectQuery,新字符串[]{});
断裂试验断裂试验;
if(cursor.moveToFirst()){
做{
breakTest=新的breakTest();
breakTest.Id=cursor.getInt(cursor.getInt(cursor.getColumnIndex(KEY_Id));
breakTest.Answered\u Question\u Set\u ID=cursor.getInt(cursor.getColumnIndex(KEY\u Answered\u Question\u Set\u ID));
breakTest.PassValue=cursor.getInt(cursor.getColumnIndex(KEY_PASS_VALUE));
breakTest.Value1=cursor.getInt(cursor.getColumnIndex(KEY_VALUE_1));
breakTest.Value2=cursor.getInt(cursor.getColumnIndex(KEY_VALUE_2));
breakTest.Value3=cursor.getInt(cursor.getColumnIndex(KEY_VALUE_3));
breakTest.Value4=cursor.getInt(cursor.getColumnIndex(KEY_VALUE_4));
breakTest.Value5=cursor.getInt(cursor.getColumnIndex(KEY_VALUE_5));
试验。添加(断裂试验);
}while(cursor.moveToNext());
}
回归测试;
}
我已经与Android Studio和SQLite合作了一段时间,但我从未遇到过这个问题


如有任何意见/反馈,将不胜感激

当您不需要传递参数时,为什么要提供
新字符串[]{}

试试这个

Cursor cursor = Shared.db.getReadableDatabase().rawQuery(selectQuery, null);

当您不需要传递参数时,为什么要提供
新字符串[]{}

试试这个

Cursor cursor = Shared.db.getReadableDatabase().rawQuery(selectQuery, null);

据我所知,您的表有8列,而不是7列。 Id、问题、通过和5个值。 因此,如果消息“无法从第8列读取”为空,则该消息非常有效,例如,您尝试使用
.getInt
使用cursor.isNull(columnIndex)
确保其中包含有效数据,如

if (!cursor.isNull(cursor.getColumnIndex(KEY_VALUE_1))) breakTest.value1=cursor.getInt(...)

没有一列被定义为NOTNULL,因此您需要签入代码。

据我所知,您的表有8列,而不是7列。 Id、问题、通过和5个值。 因此,如果消息“无法从第8列读取”为空,则该消息非常有效,例如,您尝试使用
.getInt
使用cursor.isNull(columnIndex)
确保其中包含有效数据,如

if (!cursor.isNull(cursor.getColumnIndex(KEY_VALUE_1))) breakTest.value1=cursor.getInt(...)

您的所有列都未定义为NOTNULL,因此您需要签入代码。

感谢您对这一行代码的所有注释

breakTest.Id = cursor.getInt(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
改为

breakTest.Id = cursor.getInt(cursor.getColumnIndex(KEY_ID));

感谢所有的评论,这一行代码的问题

breakTest.Id = cursor.getInt(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
改为

breakTest.Id = cursor.getInt(cursor.getColumnIndex(KEY_ID));

我们可以要stacktrace的副本吗?您现有的表只能有7列,您可以最近添加新的列,尝试更改表或清除应用程序数据,然后再试一次。霍什:每当我尝试获取完整的堆栈跟踪时,我的应用程序崩溃,我能给出的只是异常消息。MathaN:我之前已经清除了数据,它正常工作了一段时间,然后突然开始抛出错误。但问题是我只有7列不,你有8列<代码>1-Id,2-responsed\u Question\u Set\u Id,3-PassValue,4-Value1,5-Value2,6-Value3,7-Value4,8-Value5!!我们可以要stacktrace的副本吗?您现有的表只能有7列,您可以最近添加新的列,尝试更改表或清除应用程序数据,然后再试一次。霍什:每当我尝试获取完整的堆栈跟踪时,我的应用程序崩溃,我能给出的只是异常消息。MathaN:我之前已经清除了数据,它正常工作了一段时间,然后突然开始抛出错误。但问题是我只有7列不,你有8列<代码>1-Id,2-responsed\u Question\u Set\u Id,3-PassValue,4-Value1,5-Value2,6-Value3,7-Value4,8-Value5!!感谢您指出这一点,按照建议进行了更改,但没有任何区别。参考@Grisgram答案,我认为他是对的。你有8个专栏。感谢你指出这一点,按照建议进行了更改,但没有任何区别。参考@Grisgram-answer,我认为他是对的。你有8个专栏。如果我在这里(正如其他人已经建议的那样),你可以接受这个作为答案来表示感谢。谢谢。第八栏是第九栏。对于空值,此错误消息不会发生。无论如何,对具有可空列的表进行空检查不是一个坏主意。如果我在这里(正如其他人已经建议的那样),您可以接受此作为答案来表示感谢。谢谢。第八栏是第九栏。对于空值,此错误消息不会发生。无论如何,对具有可空列的表进行空检查不是一个坏主意。