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

时间:2018-04-26 14:09:43

标签: android sqlite android-sqlite

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

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

这是我尝试添加优先级的方法:

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;
}

这是我的优先事项活动中的onCreate。即使我通过数据库浏览器向我的数据库添加数据,它也总是空着的。

List<String> priorityList = new ArrayList<>();
TODODbHelper dbHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_priorities);

    dbHelper = new TODODbHelper(this);
    priorityList = dbHelper.getAllPriorities();
}

当我想在此活动中向我的数据库添加数据时,它看起来像这样:

dbHelper.addPriority(newPriority.getText().toString());

调用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会递增。

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

1 个答案:

答案 0 :(得分:0)

您的/问题是以下行: -

priorityList.add(c.getString(c.getColumnIndex(PriorityTable.TABLE_NAME)));

PriorityTable.TABLE_NAME不是Cursor中列的名称,因此从getColumnIndex方法返回的偏移量为-1。

该行应该是: -

priorityList.add(c.getString(c.getColumnIndex(PriorityTable.COLUMN_NAME)));
  

此外,如果我在尝试添加数据后通过浏览器向我的数据库添加数据   使用我的addPriorities方法,_ID会递增。

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