【问题标题】:Error on cursor level of my Android code我的 Android 代码的光标级别错误
【发布时间】:2017-02-23 19:55:39
【问题描述】:

我正在使用 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;
    }
}

【问题讨论】:

  • 日志中有行号吗?

标签: android sql sqlite


【解决方案1】:

您在创建查询中缺少逗号:

COLUMN_NAME +" Text, "+

因此该列不存在,这就是 getColumnIndex 返回 -1 的原因

我还建议使用您的变量 COLUMN_NAME 而不是硬编码的 "name"

【讨论】:

  • 我刚才按你说的修好了,但还是一直显示同样的错误
  • 你清除数据了吗?您需要再次调用 onCreate() 并重新定义表格。
  • 清除应用中的数据。您可以通过 adb 或设备上的应用设置或卸载/重新安装来完成
  • 我只是这样做了,但现在应用程序只是在手机上冻结,logcat 上没有错误,
  • 您的 SELECT 查询看起来也有问题。不确定“WHERE 1”应该做什么
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
相关资源
最近更新 更多