我正在使用sqlite数据库并且我遇到了光标,我无法弄清楚这个错误,这是完整的错误,因为它在Logcat中显示。
问题:java.lang.IllegalStateException:无法从CursorWindow读取第0行col -1。在从中访问数据之前,请确保Cursor已正确初始化。
我的代码是这样的:
public class dbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION=1;
private static final String DATABASE_NAME="WorkLoadManager";
private static final String TABLE_NAME="Jobs";
//columns for table
private static final String COLUMN_ID="_id";
private static final String COLUMN_NAME="name";
private static final String COLUMN_DESCRIPTION="description";
public dbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable=" CREATE TABLE " + TABLE_NAME + " ( " +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME +" Text "+
COLUMN_DESCRIPTION + " TEXT " +
");";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL(" DROP TABLE IF EXISTS "+ TABLE_NAME);
onCreate(db);
}
//add
public void addJob(Job job){
SQLiteDatabase db=getWritableDatabase();
ContentValues values =new ContentValues();
values.put(COLUMN_NAME,job.getName());
values.put(COLUMN_DESCRIPTION,job.getDescription());
db.insert(TABLE_NAME, null,values);
db.close();
}
//delete
public void deleteJob(String name){
SQLiteDatabase db=getWritableDatabase();
db.execSQL("DELETE FROM " +TABLE_NAME+ " WHERE "+COLUMN_NAME+ "=\""+ name +"\";");
}
//print database as a string
public String dataBaseToString(){
String dbString="";
SQLiteDatabase db=getWritableDatabase();
String query="SELECT * FROM "+ TABLE_NAME+ " WHERE 1";
//CURSOR
Cursor c = db.rawQuery(query, null);
//move to first row
c.moveToFirst();
try {
while (!c.isAfterLast()) {
if (c.getString(c.getColumnIndex("name")) != null) {
dbString += c.getString(c.getColumnIndex("name"));
dbString += "\n";
}
}
}catch (Exception e){
Log.i("problem",e.toString());
}
db.close();
return dbString;
}
}
这是我的主要活动代码:
public class MainActivity extends AppCompatActivity {
EditText inputBox;
EditText inputNameBox;
TextView display;
dbHelper myHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inputBox =(EditText)findViewById(R.id.inputBox);
inputNameBox=(EditText)findViewById(R.id.inputName);
display=(TextView) findViewById(R.id.display);
myHelper=new dbHelper(this, null, null, 1);
printDatabase();
}
public void printDatabase(){
String dbString=myHelper.dataBaseToString();
display.setText(dbString);
inputBox.setText("");
inputNameBox.setText("");
}
public void addOnclick(View view) {
Job job=new Job(inputBox.getText().toString(),inputNameBox.getText().toString());
myHelper.addJob(job);
printDatabase();
}
public void deleteOnClick(View view) {
String input=inputBox.getText().toString();
myHelper.deleteJob(input);
printDatabase();
}
}
这是我的另一课作业:
public class Job {
private int _id;
private String jobName;
private String description;
//empty constructor
public Job() {
}
public Job(String name)
{
this.jobName=name;
}
public Job( String name,String description) {
this.jobName=name;
this.description = description;
}
public Job(int id,String name, String description) {
this._id = id;
this.jobName=name;
this.description = description;
}
public String getName() {
return jobName;
}
public void setName(String name) {
this.jobName = name;
}
public int getId() {
return _id;
}
public void setId(int id) {
this._id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
答案 0 :(得分:0)
您在创建查询中缺少逗号:
COLUMN_NAME +" Text, "+
因此,该列不存在,这就是getColumnIndex
返回-1的原因
我还建议您使用变量COLUMN_NAME
而不是硬编码"name"