我正在android中创建一个SQLite数据库。但是每当我调用方法“displayDatabase()”时,都会出现一些错误。
请帮忙!!
这是displayDatabase()方法:
public void displayDatabase() {
DataDbHelper mDbHelper = new DataDbHelper(this);
SQLiteDatabase db = mDbHelper.getReadableDatabase();
String[] projection = {DataContract.DataEntry.COLUMN_PROJECT_NAME,
DataContract.DataEntry.COLUMN_HEAD,
DataContract.DataEntry.COLUMN_CITY,
DataContract.DataEntry.COLUMN_COST};
Cursor c = db.query(DataContract.DataEntry.TABLE_NAME,
projection,
null,
null,
null,
null,
null);
TextView textView = (TextView) findViewById(R.id.textview);
try {
//textView.setText("The database contains - " + c.getColumnCount() + "Columns containing data");
textView.setText("Hello Welcome\n");
textView.append("-" + DataContract.DataEntry._ID
+ "---" + DataContract.DataEntry.COLUMN_PROJECT_NAME
+ "---" + DataContract.DataEntry.COLUMN_HEAD
+ "---" + DataContract.DataEntry.COLUMN_CITY
+ "---" + DataContract.DataEntry.COLUMN_COST + "\n");
int currentId = c.getColumnIndex(DataContract.DataEntry._ID);
int projectNameId = c.getColumnIndex(DataContract.DataEntry.COLUMN_PROJECT_NAME);
int headId = c.getColumnIndex(DataContract.DataEntry.COLUMN_HEAD);
int cityId = c.getColumnIndex(DataContract.DataEntry.COLUMN_CITY);
int costId = c.getColumnIndex(DataContract.DataEntry.COLUMN_COST);
while (c.moveToNext()) {
int id = c.getInt(currentId);
String projectName = c.getString(projectNameId);
String head = c.getString(headId);
String city = c.getString(cityId);
String cost = c.getString(costId);
textView.append("-" + id
+ "---" + projectName
+ "---" + head
+ "---" + city
+ "---" + cost);
}
} finally {
c.close();
}
}
这是logcat中出现的错误:
CursorWindow:无法从具有11行,4列的CursorWindow读取第0行第-1列。 03-15 10:00:58.359 6348-6348 /? E / AndroidRuntime:FATAL EXCEPTION:main进程:com.example.student.sampledatabase,PID:6348 java.lang.IllegalStateException:无法从CursorWindow读取第0行col -1。在从中访问数据之前,请确保正确初始化Cursor。
将此列DataContract.DataEntry._ID
添加到投影中。
失败的原因是尝试获取偏移-1的列,这将永远不存在,因为偏移量可以从0到光标中的列数减1。
使用-1的原因是因为当传递给方法的列名在游标中不存在时,这是从Cursor getColumnIndex方法返回的值。
你得到-1的原因是你没有包括根据DataContract.DataEntry._ID在光标中解析的名称列,所以行: -
int currentId = c.getColumnIndex(DataContract.DataEntry._ID);
结果currentId为-1
因此执行以下行时出现上述错误: -
int id = c.getInt(currentId);
一个修复,是指定null而不是projection,这将导致检索表的所有列,并且相当于使用SELECT * FROM .......
例如通过使用 :-
Cursor c = db.query(DataContract.DataEntry.TABLE_NAME,
null,
null,
null,
null,
null,
null);
另一个解决方法是改变: -
String[] projection = {DataContract.DataEntry.COLUMN_PROJECT_NAME,
DataContract.DataEntry.COLUMN_HEAD,
DataContract.DataEntry.COLUMN_CITY,
DataContract.DataEntry.COLUMN_COST};
改为: -
String[] projection = {DataContract.DataEntry._ID,
DataContract.DataEntry.COLUMN_PROJECT_NAME,
DataContract.DataEntry.COLUMN_HEAD,
DataContract.DataEntry.COLUMN_CITY,
DataContract.DataEntry.COLUMN_COST};
因此,该列将包含在Cursor中,并且偏移量将是该列的偏移量(在上面的情况下为0,因为它是结果中的第一列)。