为数据库创建的此游标有什么错误?

时间:2019-03-15 12:21:40

标签: android sqlite android-sqlite android-database

我正在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:无法从CursorWindow读取第0行,第-1列   它有11行4列。 03月15日10:00:58.359 6348-6348 /?   E / AndroidRuntime:致命异常:main                                                    流程:com.example.student.sampledatabase,PID:6348                                                    java.lang.IllegalStateException:无法从中读取行0,col -1   CursorWindow。确保游标已正确初始化,然后再进行   从中访问数据。

2 个答案:

答案 0 :(得分:2)

将此列DataContract.DataEntry._ID添加到您的投影中。

答案 1 :(得分:0)

错误原因

失败的原因是试图获取偏移量为-1的列,该列将永远不存在,因为偏移量可以是0到游标中的列数减去1。

之所以使用-1,是因为这是从 当传递给该方法的列名在光标中不存在时,使用光标 getColumnIndex 方法。

获得-1的原因是,您没有按照游标中解析的DataContract.DataEntry._ID的名称包含列,因此该行:-

int currentId = c.getColumnIndex(DataContract.DataEntry._ID);

导致 currentId 为-1

因此在执行以下行时出现上述错误:-

int id = c.getInt(currentId);

修复

一种解决方法是指定 null 而不是 projection ,这将导致检索表的所有列,等效于使用{{1} }

例如通过使用:-

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

因此,该列将包含在游标中,并且偏移量将是该列的偏移量(在上述情况下为0,因为它是结果的第一列)。