Can';无法在Android Studio中读取或写入SQLite数据库

Can';无法在Android Studio中读取或写入SQLite数据库,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,这是数据库类中的onCreate。我用SQLiteOpenHelper扩展了它。我创建了三个表,可以在db浏览器中看到它们 public void onCreate(SQLiteDatabase db) { this.db = db; final String SQL_CREATE_TODO_TABLE = "CREATE TABLE " + TODOTable.TABLE_NAME + " ( " + TODOTable._ID

这是数据库类中的onCreate。我用SQLiteOpenHelper扩展了它。我创建了三个表,可以在db浏览器中看到它们

public void onCreate(SQLiteDatabase db) {
    this.db = db;

    final String SQL_CREATE_TODO_TABLE = "CREATE TABLE " +
            TODOTable.TABLE_NAME + " ( " +
            TODOTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            TODOTable.COLUMN_TITLE + " TEXT, " +
            TODOTable.COLUMN_DESCRIPTION + " TEXT, " +
            TODOTable.COLUMN_DATE + " TEXT, " +
            TODOTable.COLUMN_PRIORITY + " TEXT, " +
            TODOTable.COLUMN_CATEGORY + " TEXT " +
            ")";
    db.execSQL(SQL_CREATE_TODO_TABLE);

    final String SQL_CREATE_PRIORITY_TABLE = "CREATE TABLE " +
            PriorityTable.TABLE_NAME + " ( " +
            PriorityTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            PriorityTable.COLUMN_NAME + " TEXT " +
            ")";
    db.execSQL(SQL_CREATE_PRIORITY_TABLE);

    final String SQL_CREATE_CATEGORY_TABLE = "CREATE TABLE " +
            CategoryTable.TABLE_NAME + " ( " +
            CategoryTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            CategoryTable.COLUMN_NAME + " TEXT " +
            ")";
    db.execSQL(SQL_CREATE_CATEGORY_TABLE);
}
这是我尝试添加priorites的方法:

public void addPriority(String priority) {
    ContentValues cv = new ContentValues();
    cv.put(PriorityTable.COLUMN_NAME, priority);
    db.insert(PriorityTable.TABLE_NAME, null, cv);
}
这是我尝试从数据库中读取优先级的方法:

public List<String> getAllPriorities() {
    List<String> priorityList = new ArrayList<>();
    db = getReadableDatabase();
    Cursor c = db.rawQuery("SELECT * FROM " + PriorityTable.TABLE_NAME, null);
    if (c.moveToFirst()) {
        do {
            priorityList.add(c.getString(c.getColumnIndex(PriorityTable.TABLE_NAME)));
        } while (c.moveToNext());
    }
    c.close();
    return priorityList;
}
调用addPriority后,什么也没有发生。我在我的数据库中没有看到任何更改,下次我打开应用程序时,它会崩溃,我得到以下异常:

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it
在调试过程中,我发现了一个CursorIndex越界异常,并且无论我做什么,我的光标总是在-1,这应该由moveToFirst修复

此外,如果在尝试使用addPriorities方法添加数据后,通过浏览器将数据添加到数据库中,则_ID将增加


我的第一个想法是我混淆了我的常数,但如果是这样的话,我真的看不到它。

您的/a问题在于以下行:-

priorityList.add(c.getString(c.getColumnIndex(PriorityTable.TABLE_NAME)));
PriorityTable.TABLE_NAME不是游标中列的名称,因此从
getColumnIndex
方法返回的偏移量为-1

这条线可能是:-

priorityList.add(c.getString(c.getColumnIndex(PriorityTable.COLUMN_NAME)));
另外,如果我在尝试添加数据后通过浏览器将数据添加到数据库中 使用我的addPriorities方法_ID递增


您可以使用浏览器工具修改数据库。但是,您需要保存数据库,然后将文件复制到适当位置的设备。

您正在尝试获取一个不存在的列。
getColumnIndex
。你给了它一个桌子的名字谢谢Kling Klang和Matt Gibson。我知道我混淆了我的常数。我还发现通过浏览器添加数据没有任何作用。毕竟它只是一个浏览器。
priorityList.add(c.getString(c.getColumnIndex(PriorityTable.TABLE_NAME)));
priorityList.add(c.getString(c.getColumnIndex(PriorityTable.COLUMN_NAME)));