这是我的数据库类中的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会递增。
我的第一个想法是我混淆了我的常数,但如果是这样,我真的无法看到它。
答案 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会递增。
您可以使用浏览器工具修改数据库。但是,您需要保存数据库,然后将文件复制到适当位置的设备。