为数据库创建的游标中的错误是什么?

问题描述 投票:0回答:2

我正在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。

android sqlite android-sqlite android-database
2个回答
2
投票

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


0
投票

The Cause of the Error

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

使用-1的原因是因为当传递给方法的列名在游标中不存在时,这是从Cursor getColumnIndex方法返回的值。

你得到-1的原因是你没有包括根据DataContract.DataEntry._ID在光标中解析的名称列,所以行: -

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

结果currentId为-1

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

int id = c.getInt(currentId);

The Fix

一个修复,是指定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,因为它是结果中的第一列)。

© www.soinside.com 2019 - 2024. All rights reserved.